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

Вот одно обходное решение: diff кажется, принимает <(expr) как arguemnts:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
23
08.09.2011, 17:59
3 ответа

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

/<TEXT1>/ {
  r File1
  d
}

Выполнение его:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>
24
27.01.2020, 19:42
  • 1
    Спасибо это работает. Но я не хочу использовать любой другой файл сценария. Есть ли какое-либо встроенное решение? –  chanchal1987 08.09.2011, 17:57
  • 2
    Уверенный: sed '/<TEXT1>/{rFile1^Md^M}' File2, где "^M" - Вы нажимающий возврат. Проблема состоит в том, что sed действительно нужны новые строки в {...} Разграничить r и команду d. –  Kusalananda♦ 08.09.2011, 18:46
  • 3
    с ударом, строки posix-стиля являются немного более чистыми: sed $'/<TEXT1>/ {r File1\n d}' –  glenn jackman 08.09.2011, 20:18
  • 4
    Также с-e для одного лайнера: sed -e '/<TEXT1>/{r File1' -e 'd}' File2 –  sdaau 07.06.2012, 17:12
  • 5
    И что, если вместо того, чтобы заменить всю строку, содержащую <TEXT1>, Я просто хочу заменить саму строку, оставляя остальную часть строки неповрежденной? Text1: <TEXT1> кому: Text1: <file_contents>. –  Robin Winslow 10.05.2014, 20:13

Я отвечаю потому что 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.

7
27.01.2020, 19:42

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

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

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

9
27.01.2020, 19:42

Теги

Похожие вопросы