sed '/pattern/{r file_b
a\
:f
n; b f
}' file_a
Если file_b
уже заканчивается символом новой строки, и вы не хотите, чтобы на выходе была пустая строка, пропустите строку a\
из скрипта.
В последней строке :f
определяет метку, n
считывает новую строку, (которая будет напечатана автоматически, так как опция -n
не была указана для sed
), а b f
переходит к метка f
, создавая цикл. Все это для того, чтобы добавить file_b
только после первой строки , соответствующей шаблону. Если вы хотите добавить file_b
после каждой строки , соответствующей pattern
, это намного проще:
sed '/pattern/r file_b' file_a
Пример:
$ cat file_a
first
second
third
fourth
first
second
third
fourth
$ cat file_b
b1
b2
b3
$ sed '/second/{r file_b
:f n; b f }' file_a
first
second
b1
b2
b3
third
fourth
first
second
third
fourth
$ printf "x\ny\nz" >file_c
$ sed '/second/{r file_c
a
:f n; b f }' file_a
first
second
x
y
z
third
fourth
first
second
third
fourth
$ sed '/second/r file_b' file_a
first
second
b1
b2
b3
third
fourth
first
second
b1
b2
b3
third
fourth
Другим решением было бы использование ed(1)
(, которое, как ни странно, недоступно по умолчанию в современных дистрибутивах Linux, несмотря на то, что оно предписано POSIX и присутствует во всех системах unix примерно 45 лет назад):
echo '/pattern/r file_b
w' | ed file_a
Это отредактирует file_a
на месте и добавит новую строку, если она есть в конце file_b
; если вы хотите, чтобы выходные данные записывались в другой файл, измените w
на w output_file
.