una texto sustituir lineas linea eliminar como comando caracter buscar añadir archivo agregar linux bash sed awk grep

linux - texto - sed sustituir una linea



¿Cómo agrego una línea de texto al medio de un archivo usando bash? (6)

¿Qué tal algo así como:

sed -e '':a;N;$!ba;s/nameserver/nameserver 127.0.0.1/nnameserver/'' /etc/resolv.conf

(similar a esto: sed: encuentra el patrón sobre dos líneas, no lo reemplaza después de ese patrón )

Estoy tratando de agregar una línea de texto en el medio de un archivo de texto en un script bash. Específicamente, intento agregar un servidor de nombres a mi archivo /etc/resolv.conf. Tal como está, resolv.conf se ve así:

# Generated by NetworkManager domain dhcp.example.com search dhcp.example.com nameserver 10.0.0.1 nameserver 10.0.0.2 nameserver 10.0.0.3

Mi objetivo es agregar el nameserver 127.0.0.1 encima de todas las demás líneas del servidor de nombres, pero debajo de cualquier texto sobre eso. Al final, quiero que mi archivo resolve.conf se vea así:

# Generated by NetworkManager domain dhcp.example.com search dhcp.example.com nameserver 127.0.0.1 nameserver 10.0.0.1 nameserver 10.0.0.2 nameserver 10.0.0.3

¿Cómo es esto posible a través de un script bash? ¿Esto es algo que Sed o awk pueden hacer? ¿O sería la mejor opción moverme creativamente para recrear el archivo?


Aquí hay una solución de Perl:

perl -lne ''if (not $f and /^nameserver/){ print "nameserver 127.0.0.1"; $f=1 }; print'' resolv.conf

  • -n bucle alrededor de cada línea del archivo de entrada, no imprima automáticamente cada línea

  • -l elimina las nuevas líneas antes del procesamiento y las agrega de nuevo en adelante

  • -e ejecuta el código perl

$f se usa como una bandera para indicar que la cadena del servidor de nombres ya se ha encontrado


Aquí hay una solución que usa sed:

$ sed -n ''H;${x;s/^/n//;s/nameserver .*$/nameserver 127.0.0.1/n&/;p;}'' resolv.conf # Generated by NetworkManager domain dhcp.example.com search dhcp.example.com nameserver 127.0.0.1 nameserver 10.0.0.1 nameserver 10.0.0.2 nameserver 10.0.0.3

Cómo funciona: primero, suprime la salida de sed con el indicador -n . Luego, para cada línea, agregamos la línea al espacio de espera, separándolos con nuevas líneas:

H

Cuando llegamos al final del archivo (direccionado por $ ) movemos el contenido del espacio de espera al espacio del patrón:

x

Si la primera línea en el espacio del patrón está en blanco, la reemplazamos por nada.

s/^/n//

Luego reemplazamos la primera línea comenzando con el nameserver de nameserver por una línea que contiene el nameserver 127.0.0.1 , una nueva línea (su versión de sed puede no ser compatible /n , en cuyo caso reemplaza la n con una línea nueva literal) y la línea original (representada por & ):

s/nameserver .*$/nameserver 127.0.0.1/n&/

Ahora solo tenemos que imprimir los resultados:

p


Esto podría funcionar para usted:

sed -e ''/nameserver/{x;/./b;x;h;i/nameserver 127.0.0.1'' -e ''}'' resolv.conf

O GNU sed:

sed -e ''0,/nameserver/{//i/nameserver 127.0.0.1'' -e ''}'' resolv.conf


Suponiendo que desea insertar inmediatamente después de la línea de search , esto es mucho más simple:

sed -ie ''/^search/a nameserver 127.0.0.1'' filename

  • -i : editar archivo en su lugar
  • -e : permite la ejecución de un script / comandos dentro de la expresión sed
  • a mynewtext : comando que le dice a sed que inserte el texto mynewtext después del patrón coincidente

awk ''/^nameserver/ && !modif { printf("INSERT/n"); modif=1 } {print}''