Tengo dos archivos diferentes:
Archivo1
/home/user1/
/home/user2/bin
/home/user1/a/b/c
File2
<TEXT1>
<TEXT2>
Quiero reemplazar el <TEXT1>de File2 con el contenido de File1 usando sed. Intenté este comando, pero no obtuve el resultado adecuado:
cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"
Puede usar otras herramientas también para resolver este problema.

sedimplementación está utilizando. Tu código funciona para mí con GNUsed./home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>. No obteniendo nuevas líneas.diffy laspatchherramientas permiten reemplazar algunas líneas en un archivo por otras líneas con bastante facilidad.$()en un script sed hace que mis ojos sangren. Nunca use datos externos en lugares donde algunos caracteres se interpretan con un significado especial.Respuestas:
Aquí hay una solución de script sed (más fácil a la vista que tratar de ponerla en una línea en la línea de comando):
Ejecutándolo:
fuente
sed '/<TEXT1>/{rFile1^Md^M}' File2donde "^ M" presionas volver. El problema es que sed realmente necesita las nuevas líneas dentro de {...} para delimitar los comandos r y d.sed $'/<TEXT1>/ {r File1\n d}'sed -e '/<TEXT1>/{r File1' -e 'd}' File2<TEXT1>, solo quiero reemplazar la cadena en sí, dejando el resto de la línea intacta?Text1: <TEXT1>aText1: <file_contents>.Me tomó mucho tiempo encontrar esta solución usando el reemplazo de var. Todas las soluciones sed no funcionaron para mí, ya que eliminan líneas completas o las reemplazan incorrectamente.
Reemplaza todas las ocurrencias de TEXT1 en el archivo2 contra el contenido del archivo1. El resto del texto permanece intacto.
fuente
sedtambién, ya que esas "expansiones" (también conocidas como reemplazos) están integradas en el caparazón (bashal menos)Respondo porque el método
diff/patchpuede ser de interés en algunos casos. Para definir una sustitución de líneas contenidas en el archivoblob1por líneas contenidas enblob2uso:Por ejemplo, si
blob1contiene:y
blob2contiene:el generado
patch-fileserá:Ahora, puede aplicar este parche a cualquier otro archivo:
Se reemplazará
hello,youlíneas debe,welcome,herelíneas ensomefile.fuente