¿Cómo reemplazo TODO el texto de un archivo después de una determinada línea con el contenido de otro archivo de texto, usando sed/awk?

¿Cómo reemplazo TODO el texto de un archivo después de una determinada línea con el contenido de otro archivo de texto, usando sed/awk?

Actualmente estoy intentando automatizar la actualización del texto de un archivo, titulado original_file.txt. Imagine que el archivo se parece al siguiente:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command

Este archivo se actualizará eliminando todo el texto después de "Reemplazar todo después de esta línea" y reemplazándolo con el texto del archivo.archivo_reemplazo.txt. Por el bien de la publicación, imagina que replacement_file.txt tiene el siguiente texto:

testing123
this_is_the_replacement_text

Por lo que pude encontrar con sed, solo puedo descubrir cómo editar el resto de la línea después de una determinada frase. Quiero reemplazar el texto en original_file.txt después de la frase de reemplazo con todo el texto de replacement_file.txt (quiero conservar el texto de la línea de reemplazo para futuras actualizaciones). original_file.txt debería verse así al final:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

¡Gracias de antemano!

Respuesta1

En GNU/awk:

Nombra los dos archivos como argumentos.

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2

Respuesta2

Imprima todas las líneas hasta que se encuentre la línea "reemplazar después", luego lea desde otro archivo y salga:

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • utilizar sed -ipara guardar cambios
  • o... > tmp && mv tmp original

Respuesta3

Usando sed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

Los tres sedbloques hacen esto:

  1. El primer bloque imprime todas las líneas desde la línea 1 hasta la línea con el contenido especial. Imprimo estas líneas explícitamente py luego las invoco dpara forzar el inicio de un nuevo ciclo (" print; next" en awk).
  2. Después de que el primer bloque haya generado las líneas iniciales, el segundo bloque genera el contenido del archivo adicional.
  3. A continuación se finaliza el guión de edición.

Normalmente, qen el tercer bloque se generaría la línea actual antes de salir (esta sería la línea en el ejemplo de lectura de datos text_that_will), pero como sedse invoca con -n, esta salida predeterminada de una línea al final de un ciclo está inhibida.

El resultado del comando anterior, dados sus datos, es

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Para actualizar el archivo original, puede usar sed -i ...o redirigir la salida a un nuevo archivo que luego reemplaza el original con:

sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt

Respuesta4

si usa gnu Awk:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file

información relacionada