我如何将文件的内容a
(后跟换行符)插入到文件中b
,位于包含 的第一行之后PATTERN
?
答案1
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 强制要求并且自 45 年左右以来就存在于所有 UNIX 系统中):
echo '/pattern/r file_b
w' | ed file_a
这将就地编辑并附加换行符(如果;file_a
末尾有换行符) 。file_b
如果您希望将输出写入另一个文件,请将 更改w
为w output_file
.
答案2
怎么样
sed '/PATTERN/r a' b