[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] Sustituir texto en un fichero con SED.



Puedes usar diagonal invertida para escapar las diagonales: \/

El mié., 9 de enero de 2019 2:34 p. m., Ramses <ramses.sevilla@gmail.com> escribió:
-----Mensaje original-----
De: Ramses [mailto:ramses.sevilla@gmail.com]
Enviado el: jueves, 3 de enero de 2019 13:08
Para: debian-user-spanish@lists.debian.org
Asunto: Re: [OT] Sustituir texto en un fichero con SED.

El 3 de enero de 2019 12:58:34 CET, Matias Mucciolo <mmucciolo@suteba.org.ar> escribió:
>
>On Wednesday, January 2, 2019 10:24:03 PM -03 Ramses wrote:
>> El 2 de enero de 2019 20:14:50 CET, Ramses <ramses.sevilla@gmail.com>
>
>escribió:
>> >El 2 de enero de 2019 20:03:31 CET, Matias Mucciolo
>> >
>> ><mmucciolo@suteba.org.ar> escribió:
>> >>On Wednesday, January 2, 2019 7:53:42 PM -03 Ramses wrote:
>> >>> El 2 de enero de 2019 19:44:38 CET, Matias Mucciolo
>> >>
>> >><mmucciolo@suteba.org.ar> escribió:
>> >>> >> On Wednesday, January 2, 2019 6:39:15 PM -03 Ramses wrote:
>> >>> >> > Hola a tod@s y feliz año...
>> >>> >> >
>> >>> >> > Tengo un fichero de texto con líneas, entre otras tantas,
>que
>> >>> >
>> >>> >comienzan
>> >>> >
>> >>> >> > con:
>> >>> >> >
>> >>> >> > # P1 =
>> >>> >> > # P12 =
>> >>> >> > # P123 =
>> >>> >> > # P1234 =
>> >>> >> >
>> >>> >> > Donde cada dígito es variable entre 0 y 9, es decir, lo
>mismo
>> >
>> >te
>> >
>> >>> >> > encuentras
>> >>> >> > un '# P8' que un '# P5487', pero también te encuentras con
>> >>
>> >>líneas
>> >>
>> >>> >que
>> >>> >
>> >>> >> > empiezan por '# P pepito'.
>> >>> >> >
>> >>> >> > Me gustaría saber si hay forma de cambiar con SED todas las
>> >>
>> >>líneas
>> >>
>> >>> >que
>> >>> >
>> >>> >> > comienzan por:
>> >>> >> >
>> >>> >> > # P1 =
>> >>> >> > # P12 =
>> >>> >> > # P123 =
>> >>> >> > # P1234 =
>> >>> >> >
>> >>> >> > Y dejarlas comenzando así:
>> >>> >> >
>> >>> >> > P1 =
>> >>> >> > P12 =
>> >>> >> > P123 =
>> >>> >> > P1234 =
>> >>> >> >
>> >>> >> > Claro, manteniendo el resto de líneas del fichero tal cual
>> >>
>> >>están,
>> >>
>> >>> >por
>> >>> >
>> >>> >> > ejemplo, las que comienzan por  y el resto.
>> >>> >> >
>> >>> >> >
>> >>> >> > Saludos y gracias,
>> >>> >> >
>> >>> >> > Ramsés
>> >>> >>
>> >>> >> Buenas Ramses
>> >>> >>
>> >>> >> si esta todo bien como dijiste y tenes exactamente esas lineas
>> >>> >> con el siguiente sed podes "descomentar" las lineas
>> >>> >> que empiezas con "# PN" siendo N un numero del 0-9
>> >>> >>
>> >>> >> sed:
>> >>> >>
>> >>> >> sed '/P[0-9]/s/# //g'
>> >>> >>
>> >>> >> ejemplo la linea '# P pepito' no se modifica...
>> >>> >> probalo y cualquier duda pregunta.
>> >>> >> o pone las lineas exactamente como son y cual falla..
>> >>> >>
>> >>> >> saludos.
>> >>> >> Matias.-
>> >>> >
>> >>> >acomodo el sed se me paso la parte de "empieza por bla"
>> >>> >
>> >>> >sed '/^# P[0-9]/s/# //g'
>> >>> >
>> >>> >ahora si ...
>> >>> >saludos
>> >>> >Matias.
>> >>>
>> >>> Ha, bien, te estaba contestando a tu correo para comentarte que
>si
>> >
>> >no
>> >
>> >>> faltaba el ^.
>> >>>
>> >>> Ahora, está línea (sed '/^# P[0-9]/s/# //g') sustituiría las
>líneas
>> >>
>> >>que
>> >>
>> >>> comienzan, por ejemplo, por '# P8', pero como he comentado, ¿y
>para
>> >>
>> >>las
>> >>
>> >>> líneas que comienzan por '# P65', '# P756' o '# P 6548'?
>> >>>
>> >>> Es decir, las líneas pueden comenzar desde '# PN =' hasta '#
>PNNNN
>> >>
>> >>='.
>> >>
>> >>> Saludos y gracias,
>> >>>
>> >>> Ramsés
>> >>
>> >>Mientras no tengan espacio, es decir, '# P N' (que veo en tu
>pregunta
>> >>'# P 6548' ) serviria desde '# PN'  hasta  '# PNNNNNNNNNN(...)'
>> >>infinito.
>> >>
>> >>ahora si hay espacio...lo mas facil es correr este comando
>> >>y una segunda pasada con este otro:
>> >>
>> >>sed '/^# P [0-9]/s/# //g'
>> >>
>> >>y con esas dos pasadas se solucionaria.
>> >>
>> >>ejemplo:
>> >>
>> >>$ cat aa
>> >># P1 =
>> >># P12 =
>> >># P123 =
>> >># P1234 =
>> >># P31234 =
>> >># P pepito =
>> >># P 6548 =
>> >>$
>> >>$ cat aa | sed '/^# P[0-9]/s/# //g' | sed '/^# P [0-9]/s/# //g'
>> >>P1 =
>> >>P12 =
>> >>P123 =
>> >>P1234 =
>> >>P31234 =
>> >># P pepito =
>> >>P 6548 =
>> >>
>> >>
>> >>
>> >>Saludos.
>> >>Matias
>> >
>> >No, no, Matías, los números están pegados a la P, no hay espacios.
>> >
>> >
>> >Saludos,
>> >
>> >Ramsés
>>
>> Bien, Matías, muchas gracias, creo que este tema solucionado...
>>
>> Con comando:
>>
>> sed '/^# P[0-9]/s/# //g' fichero-A.txt > fichero-A-LIMPIO.txt
>>
>> Genero el mismo "fichero-A.txt" con todas las líneas que comenzaban
>con "#
>> PNNNN" cambiadas por "PNNNN".
>>
>> Ahora tengo que hacer otra cosa que no sé si se podrá hacer con SED o
>habrá
>> que usar otro comando.
>>
>> Por ejemplo, tengo el "fichero-A-LIMPIO.txt" que contiene:
>>
>> fichero-A-LIMPIO.txt
>> --------------------------------
>> P2315 = 7
>> P6 = manolo
>> P35 = www.jose.com
>>
>> Y tengo un "fichero-B.txt" que contiene:
>>
>> fichero-B.txt
>> --------------------------------
>> P2315=38
>> P6=paco
>> P35=1.2.3.4
>>
>> Ahora tendría que buscar, por ejemplo, cada una de las líneas PNNNN
>del
>> "fichero-A-LIMPIO.txt", buscarlas en el "fichero-B.txt' y sustituir
>la
>> línea del "fichero-A-LIMPIO.txt" por la que aparece en el
>"fichero-B.txt".
>>
>> Por ejemplo, buscar la línea 'P2315 = 7' del "fichero-A-LIMPIO.txt"
>en el
>> "fichero-B.txt" y sustituirla en el "fichero-A-LIMPIO.txt" por la
>línea
>> 'P2315=38' que aparece en el "fichero-B.txt".
>>
>> No sé si me explico...
>>
>> Claro, con:
>>
>> sed 's/^P2315 =.*/P2315=38/' fichero-A-LIMPIO.txt
>>
>> Pero claro, tendría que buscar la línea PNNNN en el
>"fichero-A-LIMPIO.txt",
>> buscar la misma en el "fichero-B.txt" y reemplazar la línea en el
>> "fichero-A-LIMPIO.txt' por la que aparece en el "fichero-B.txt".
>>
>> ¿O sería más fácil abrirlos en una hoja de cálculo y aplicarles unas
>> funciones?.
>>
>>
>> Saludos y gracias,
>>
>> Ramsés
>
>Buenas
>ahi ya vas a tener que hacer un script que busque el numero
>en el archivo "B" y si lo encuentra que haga el sed para reemplazarlo
>en el archivo "A" ...podes usar la opción 'i' de sed para que los
>cambios
>sean en el mismo archivo sin tener que redirigir a otro file..
>
>no es complicado con un apr de greps cut etc odes hacerlo bastante
>facil.
>Si te trabas en algo avisanos.
>
>Matias.-

>Sí, Matías, estoy terminándolo.
>
>Cuando lo acabe lo paso para que me hagáis recomendaciones de mejoras.
>
>
>Saludos,
>
>Ramsés

Matías, buenas tardes,

Ya tengo casi acabado el script, pero me he encontrado con un pequeño problema.

Cuando ejecuto el SED, como hay valores que llevan signos (/ ; :) el SED no los interpreta bien y me da un error.

Me explico con un ejemplo:

El SED que tengo es:

---------------------------------------------------------------
    echo sed 's/'$LINEA' =.*/'$VARIABLE_B'/' $FICHERO_A-LIMPIO.txt      <-- Con propósitos de debugear...
    sed -i 's/'$LINEA' =.*/'$VARIABLE_B'/' $FICHERO_A-LIMPIO.txt
---------------------------------------------------------------

Y la salida que obtengo en algunas líneas es:

---------------------------------------------------------------
sed s/P347 =.*/P347=f1=440,f2=440,c=25/525;/ config-LIMPIO.txt
sed: -e _expression_ #1, char 40: unterminated address regex

sed s/P192 =.*/P192=pagina.web.es:8090/config/prueba/ config-LIMPIO.txt
sed: -e _expression_ #1, char 46: unknown option to `s'
---------------------------------------------------------------

Esto es por el separador '/' que estoy usando en la línea SED.

Si cambio el separador '/' por '#', por ejemplo, me da menos errores, pero me siguen saliendo algunos porque también el contenido de $VARIABLE_B contiene este símbolo.

---------------------------------------------------------------
    echo sed 's#'$LINEA' =.*#'$VARIABLE_B'#' $FICHERO_A-LIMPIO.txt      <-- Con propósitos de debugear...
    sed -i 's#'$LINEA' =.*#'$VARIABLE_B'#' $FICHERO_A-LIMPIO.txt
---------------------------------------------------------------

Y la salida que obtengo en algunas líneas es:

---------------------------------------------------------------
sed s#P290 =.*#P290={ x+ | *x+ | *xx*x+ | **xxxx | #xxxx* }# config-LIMPIO.txt
sed: -e _expression_ #1, char 17: unterminated `s' command
---------------------------------------------------------------

Creo que me da también errores cuando el contenido de $VARIABLE_B incluye algún espacio, no lo puedo asegurar ahora si es ese el motivo.

¿No hay forma de que SED no interprete el contenido de $VARIABLE_B y lo tome simplemente como como el valor a sustituir?


Saludos y gracias,

Ramsés


Reply to: