
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 -i
para 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 sed
bloques hacen esto:
- 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
p
y luego las invocod
para forzar el inicio de un nuevo ciclo ("print; next
" enawk
). - Después de que el primer bloque haya generado las líneas iniciales, el segundo bloque genera el contenido del archivo adicional.
- A continuación se finaliza el guión de edición.
Normalmente, q
en 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 sed
se 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