Puedes usar diagonal invertida para escapar las diagonales: \/

El mié., 9 de enero de 2019 2:34 p. m., Ramses <[email protected]>
escribió:

> -----Mensaje original-----
> De: Ramses [mailto:[email protected]]
> Enviado el: jueves, 3 de enero de 2019 13:08
> Para: [email protected]
> Asunto: Re: [OT] Sustituir texto en un fichero con SED.
>
> El 3 de enero de 2019 12:58:34 CET, Matias Mucciolo <
> [email protected]> escribió:
> >
> >On Wednesday, January 2, 2019 10:24:03 PM -03 Ramses wrote:
> >> El 2 de enero de 2019 20:14:50 CET, Ramses <[email protected]>
> >
> >escribió:
> >> >El 2 de enero de 2019 20:03:31 CET, Matias Mucciolo
> >> >
> >> ><[email protected]> 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
> >> >>
> >> >><[email protected]> 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
>
>

Responder a