es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

sed / awk corresponden a la segunda ocurrencia de una expresión regular en un archivo, y reemplazan toda la línea.

Tratando de hacer que sed o awk hagan lo siguiente:
1) Buscar en el archivo.
2) Capturar una cadena + regex (remote_addrs.*)
3) Reemplazar toda la línea por algo diferente, por lo que “una línea que tiene” remote_addrs “y cualquier cosa después de ella” reemplazarla.

Archivo de ejemplo:

dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 2.2.2.2
woodchuck

Quiero que se cambie a esto:
Archivo de ejemplo:

dog
cat
remote_addrs = 1.1.1.1
moose
remote_addrs = 3.3.3.3
woodchuck

Intente usar lo siguiente:

sed -z ‘s/remote_addrs./remote_addrs\ =\ 3.3.3.3/2′ file
sed ‘:a;N;$!ba;s/remote_addrs.
/remote_addrs\ =\ 3.3.3.3/2′ file

pero sed se niega a reemplazar todo después de esa ocurrencia. Esto parece funcionar solo con una sola cadena.

Esto DEBE lograrse sin dar números de línea específicos, la posición de línea de “remote_addrs” debe ser variable.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado usando awk, puedes intentar el siguiente comando:

    awk '/remote_addrs.*=/{sub(/remote_addrs.*=/,"remote_addrs = 3.3.3.3")}1' archivo
    

    Este comando buscará en el archivo y capturará cualquier línea que contenga la cadena “remote_addrs” seguida de un signo igual. Reemplazará toda la línea con “remote_addrs = 3.3.3.3” e imprimirá el archivo modificado. La función sub realiza la sustitución y el 1 al final es una abreviatura de print, que imprimirá cada línea.

    Si prefieres utilizar sed, puedes modificar ligeramente tu comando original para lograr el resultado deseado:

    sed '/remote_addrs.*=/{s/.*/remote_addrs = 3.3.3.3/}' archivo
    

    Este comando buscará en el archivo y capturará cualquier línea que contenga la cadena “remote_addrs” seguida de un signo igual. Reemplazará toda la línea con “remote_addrs = 3.3.3.3”. La función s realiza la sustitución solo en las líneas coincidentes.

Comments are closed.