-----Mensaje original----- De: Ramses [mailto:ramses.sevi...@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 <mmucci...@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.sevi...@gmail.com> > >escribió: >> >El 2 de enero de 2019 20:03:31 CET, Matias Mucciolo >> > >> ><mmucci...@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 >> >> >> >><mmucci...@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