Замените строку содержимым файла с помощью sed

У меня есть два разных файла:

File1

/home/user1/ /home/user2/bin /home/user1/a/b/c 

File2

 <TEXT1> <TEXT2> 

Я хочу заменить <TEXT1> File2 на содержимое File1 с помощью sed . Я пробовал эту команду, но не получал надлежащего вывода:

 cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g" 

Вы также можете использовать другие инструменты для решения этой проблемы.

Вот решение сценария sed (проще в глазах, чем пытаться вставить его в одну строку в командной строке):

 /<TEXT1>/ { r File1 d } 

Запуск:

 $ sed -f script.sed File2 /home/user1/ /home/user2/bin /home/user1/a/b/c <TEXT2> 

Долгое время я нашел это решение, используя замену var. Все решения sed не работали для меня, поскольку они либо удаляют полные строки, либо заменяют неправильно.

 FILE2=$(<file2) FILE1=$(<file1) echo "${FILE2//TEXT1/$FILE1}" 

Заменяет все вхождения TEXT1 в файле2 на содержимое файла1. Все остальные тексты остаются нетронутыми.

Я отвечаю, потому что метод diff / patch может быть интересен в некоторых случаях. Чтобы определить замену строк, содержащихся в файле blob1 строками, содержащимися в blob2 используйте:

 diff -u blob1 blob2 > patch-file 

Например, если blob1 содержит:

 hello you 

и blob2 содержит:

 be welcome here 

сгенерированный patch-file будет:

 --- blob1 2011-09-08 16:42:24.000000000 +0200 +++ blob2 2011-09-08 16:50:48.000000000 +0200 @@ -1,2 +1,3 @@ -hello -you +be +welcome +here 

Теперь вы можете применить этот патч к любому другому файлу:

 patch somefile patch-file 

Он заменит hello , you строки, be , welcome , here строки в somefile .