obligada > linux.debian.user.spanish

Ramses (02-01-2019, 19:40)
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 '# P pepito' y el resto.

Saludos y gracias,

Ramsés
Juan Lavieri (02-01-2019, 20:00)
Hola

El 2/1/2019 a las 1:39 p.m., Ramses escribió:
[..]
> P123 =
> P1234 =
> Claro, manteniendo el resto de líneas del fichero tal cual están, por ejemplo, las que comienzan por '# P pepito' y el resto.


Mirando tu requerimiento se me despertó una vieja curiosidad y
googleando un poco conseguí estos enlaces; por lo que he estado leyendo
son bastante buenos.

Se que no es la respuesta que estás buscando, pero creo que nos podrá
ayudar en el futuro. (me incluyo porque de inmediato me pongo a trabajar
en ello)




Espero te sirvan.

Saludos.
Matias Mucciolo (02-01-2019, 20:40)
Matias Mucciolo (02-01-2019, 20:50)
> On Wednesday, January 2, 2019 6:39:15 PM -03 Ramses wrote:
[..]
> 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.
Ramses (02-01-2019, 21:00)
El 2 de enero de 2019 19:44:38 CET, Matias Mucciolo <mmucciolo> escribió:
>comienzan
>que
>que
>por
>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
Matias Mucciolo (02-01-2019, 21:10)
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> escribió:
> 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
Ramses (02-01-2019, 21:20)
El 2 de enero de 2019 20:03:31 CET, Matias Mucciolo <mmucciolo> escribió:
[..]
>P 6548 =
>Saludos.
>Matias


No, no, Matías, los números están pegados a la P, no hay espacios.

Saludos,

Ramsés
Ramses (02-01-2019, 23:30)
El 2 de enero de 2019 20:14:50 CET, Ramses <ramses.sevilla> escribió:
>El 2 de enero de 2019 20:03:31 CET, Matias Mucciolo
><mmucciolo> escribió:
>te
>no
>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 comenzabancon "# 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 =

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" porla 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
Matias Mucciolo (03-01-2019, 14:00)
On Wednesday, January 2, 2019 10:24:03 PM -03 Ramses wrote:
[..]
> 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.-
Ramses (03-01-2019, 14:10)
El 3 de enero de 2019 12:58:34 CET, Matias Mucciolo <mmucciolo> escribió:
[..]
>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
Ramses (09-01-2019, 22:40)
-----Mensaje original-----
De: Ramses [mailto:ramses.sevilla]
Enviado el: jueves, 3 de enero de 2019 13:08
Para: debian-user-spanish
Asunto: Re: [OT] Sustituir texto en un fichero con SED.

El 3 de enero de 2019 12:58:34 CET, Matias Mucciolo <mmucciolo> escribió:
[..]
>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
Paynalton (09-01-2019, 23:20)
Puedes usar diagonal invertida para escapar las diagonales: \/

El mié., 9 de enero de 2019 2:34 p. m., Ramses <ramses.sevilla>
escribió:
[..]
Matias Mucciolo (10-01-2019, 13:20)
On Wednesday, January 9, 2019 3:11:11 PM -03 Paynalton wrote:
> Puedes usar diagonal invertida para escapar las diagonales: \/


....

Buenas
si exacto...podes hacer aca como dice el compañero...escaparlo..
y tambien podes usar otro simbolo/caracter especial...
por lo general yo uso '@' si me da pereza escapar las cosas ....
obviamente sabiendo que en el texto no contiene ninguna '@' ...

saludos.
Matias.-
Ramses (10-01-2019, 18:00)
El 10 de enero de 2019 12:14:46 CET, Matias Mucciolo <mmucciolo> escribió:
>On Wednesday, January 9, 2019 3:11:11 PM -03 Paynalton wrote:
>....
>Buenas
>si exacto...podes hacer aca como dice el compañero...escaparlo..
>y tambien podes usar otro simbolo/caracter especial...
>por lo general yo uso '@' si me da pereza escapar las cosas ....
>obviamente sabiendo que en el texto no contiene ninguna '@' ...
>saludos.
>Matias.-


Y para cuándo la variable contiene espacios, ¿no hay ninguna forma de que funcione?

Saludos,

Ramsés
Matias Mucciolo (10-01-2019, 18:20)
On Thursday, January 10, 2019 4:50:11 PM -03 Ramses wrote:
> El 10 de enero de 2019 12:14:46 CET, Matias Mucciolo <mmucciolo> escribió:
> Y para cuándo la variable contiene espacios, ¿no hay ninguna forma deque
> funcione?
> Saludos,
> Ramsés


Deberia andar con comillas dobles...ejemplo :

$ export HOLA="HOLA BUENAS"
$ echo "hola que tal" | sed "s/hola que/$HOLA/g"
HOLA BUENAS tal

si te entendi mal manda un ejemplo real
saludos
Matias
Temas Similares