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 > >

