Tengo un archivo de texto ( devel.xml
).
Le agregué la palabra REPLACETHIS para reemplazar esta cadena con el contenido dentro de un archivo diferente ( temp.txt
).
Lo más cercano que tengo es esto:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Esto inserta el contenido después de la cadena y luego elimina la cadena.
¿Es esta la mejor manera de hacerlo?
text-processing
sed
perl
RafaelGP
fuente
fuente
Respuestas:
Lo que ha hecho es eliminar
SUBSTITUTETHIS
donde aparece en el archivo (pero no el resto de la línea donde aparece) e insertar el contenidotemp.TXT
debajo de esa línea. SiSUBSTITUTETHIS
aparece varias veces en una línea, solo se elimina la primera aparición y solotemp.TXT
se agrega una copia de .Si desea reemplazar la línea completa cuando
SUBSTITUTETHIS
aparece, use eld
comando. Dado que necesita ejecutar ambosr
yd
cuando haya una coincidencia, colóquelos en un grupo de refuerzo.Algunas implementaciones sed le permiten usar punto y coma para separar comandos y omitir separadores por completo entre llaves, pero aún necesita una nueva línea para terminar el argumento del
r
comando:Si desea reemplazar
SUBSTITUTETHIS
por el contenido del archivo, pero conserva lo que viene antes y después en la línea, es más complicado. El método más simple es incluir el contenido del archivo en el comando sed; tenga en cuenta que deberá citar correctamente su contenido.O usa Perl. Esto es breve pero se ejecuta
cat
una vez para cada sustitución:Para leer el archivo una vez cuando se inicia el script y evitar depender de un comando de shell:
(presentado en dos líneas para facilitar la lectura, pero puede omitir el salto de línea). Si el nombre del archivo es variable, para evitar problemas de citas, páselo al script a través de una variable de entorno:
fuente
cat temp.txt
poder hacerlocat ${variable}
?-0777
interruptor para slurp en todo el archivo, y un regularopen
:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
finalizar con mensajes como "BEGIN temp.TXT", "END temp.TXX"a
(agregar) comando. grymoire.com/Unix/Sed.html#uh-36