Интересный вопрос. Как уже упоминалось, вся история для sed, чтобы иметь возможность вставлять многострочный текст в другой файл, состоит в том, что этот новый многострочный текст должен иметь на самом деле литерал \n
для разрывов строк.
Таким образом, мы можем использовать СЭД, чтобы преобразовать реальные новые символы строки в буквальном \n
:
$ a=$(tr '\n' '\\' <file3 |sed 's#[\]$##' |sed "s#[\]#\0n#g")
#Alternative: a=$(sed "s#[\]#\0n#g" <(sed 's#[\]$##' <(tr '\n' '\\' <file3)))
$ echo "$a"
apples\noranges\nbananas\ncarrots
Как это перевод работы:
* Во-первых, мы заменим все новые линии с одной обратной косой черты с помощью tr
* Тогда мы удаляем обратную косую черту с конца строки
* Затем мы заменяем все остальные обратные косые черты обратным слэшем и символом n char.
Поскольку в настоящее время переменная $a
содержит литерал \n
между строк, СЭД будет переводить их обратно actuall новые линии:
$ cat file4
Line1
line2
line3
$ sed "2i $a" file4
Line1
apples
oranges
bananas
carrots
line2
line3
Результат:
многострочного замена может быть сделано с двумя командами:
$ a=$(tr '\n' '\\' <file3 |sed 's#[\]$##' |sed "s#[\]#\0n#g")
$ sed "2i $a" file4
sed 2i
означает вставить текст перед строкой2. 2a
может использоваться для вставки чего-либо после строки2.
Примечание:
Согласно this post который, кажется, дубликат, перевод новых строк в буквальном \ п кажется, что может быть сделано только с:
a=$(echo ${a} | tr '\n' "\\n")
Но этот метод никогда не работал в моей системе.
Remark2:
СЭДА операции sed "2i $a"
= вставить переменные $ а перед строкой 2, может быть также выражен как sed "1 s/.*/\0\n$a/"
= заменить все символы из первой строки с теми же символами \0
плюс новой линией \n
плюс содержимым переменной $a
=> вставить $ a после строки1 = вставить $ a перед линией2.
Вы можете добавить полный ввод/вывод образца? 'TEST' имеет несколько значений строки строки, и вы добавляете строку до и после ... так что для меня немного неясно ... для вставки только содержимого из файла, используйте команду' r' ... 'sed ' 14r foo 'target' -> вставляет содержимое файла foo с 15-й строки вперед, чтобы ввести целевой файл – Sundeep