Замените все строки между двумя шаблонами (включительно) с содержанием файла

Все сказано в заголовке, я хочу заменить все строки между двумя шаблонами с содержание файла.

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
3
задан 29 January 2018 в 20:38

1 ответ

Вы близки, я думаю - Ваш основной вопрос - это $(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
3
ответ дан 1 December 2019 в 16:18

Другие вопросы по тегам:

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