$ 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 强制要求并在 45 年左右的时间里出现在所有 unix 系统中):
如果
file_b
已经由换行符终止,并且您不希望输出中出现空行,请a\
从脚本中省略该行。在最后一行,
:f
定义了一个标签,读取一个换行符(由于没有给 选项n
,将自动打印),然后分支到标签,创建一个循环。所有这一切都是为了仅在第一行匹配模式之后附加。如果你想在每一行匹配之后追加,就简单多了:-n
sed
b f
f
file_b
file_b
pattern
例子:
另一种解决方案是使用
ed(1)
(令人惊讶的是,现代 linux 发行版默认情况下不可用,尽管 POSIX 强制要求并在 45 年左右的时间里出现在所有 unix 系统中):这将
file_a
就地编辑并在 ; 末尾添加换行符(如果有的话)file_b
。如果要将输出写入另一个文件,w
请将w output_file
.怎么样