Все сказано в заголовке, я хочу заменить все строки между двумя шаблонами с содержание файла.
file1
line 1
line 2
foo
foobar
bar
line 6
line 7
file2
line 3
line 4
line 5
желаемый файл
line 1
line 2
line 3
line 4
line 5
line 6
line 7
Попробованный много sed управляют, чтобы ничто не работало на меня, самую близкую команду ниже успешно matchs строки между нечто и панелью, но замените их "$ (кошка file2)" строка и не содержание файла.
sed '/foo/{:a;N;/bar/!ba;N;s/.*\n/$(cat file2)/};p' file1
Вы близки, я думаю - Ваш основной вопрос - это $(cat file2)
будет рассматриваемым как литерал в одинарных кавычках - необходимо использовать встроенное r
команда:
r filename
Поставьте содержание в очередь имени файла, которое будет считано и вставлено в поток вывода в конце текущего цикла, или когда следующая входная строка будет считана. Обратите внимание, что, если имя файла не может быть считано, его рассматривают, как будто это был пустой файл без любого ошибочного признака.
Так:
sed '
/foo/{
:a
N
/\nbar$/!ba
r file2
d
}
' file1
Если Вы хотите пререкаться это в остроту существует прием, необходимо будет препятствовать тому, чтобы sed рассматривал все после r
как часть имени файла:
sed -e '/foo/{:a; N; /\nbar$/!ba; r file2' -e 'd;}' file1