使用 sed 在第 N 个匹配模式之后插入一些文本

Posted

技术标签:

【中文标题】使用 sed 在第 N 个匹配模式之后插入一些文本【英文标题】:Insert some text after Nth matching pattern using sed 【发布时间】:2013-07-02 04:02:03 【问题描述】:

我该怎么做?我有多个例如我的文件中的 foobar 模式,我如何在例如之后添加第四个 some_text?

【问题讨论】:

所以您想在整个文件第 n 次出现时插入/替换?例如。一行可以有任意数量的“foobar” @kent:不是每一行只包含一个 foobar,而是整个文件包含很多。 【参考方案1】:

以下内容对您有用吗?

sed ':a;$!N;ba;s/\(foobar\)/\1\nsome_text/4' inputfile

对于输入:

$ cat inputfile
line
foobar
foobar
foobar
line
foobar
line
foobar
line
foobar
line

这会产生

$ sed ':a;$!N;ba;s/\(foobar\)/\1\nsome_text/4' inputfile
line
foobar
foobar
foobar
line
foobar
some_text
line
foobar
line
foobar
line

在 FreeBSD 上使用 -e

sed -e :a -e '$!N' -e '$!ba' -e 's/\(foobar\)/\1\nsome_text/4' inputfile

【讨论】:

这个错误:sed: 1: ":a;$!N;ba;s/(foobar\ ...": 未使用标签 'a;$!N;ba; s/(foobar)/\1\nsome_text/4' 阅读manual,然后问你没有关注什么。 如果插入多行,末尾带有\n,还包含/,我该怎么办? sed -e :a -e '$!N' -e '$!ba' -e 's#\(foobar\)#\1\nsome_text\nmore_text_on_new_line_with_/_character#4' inputfile【参考方案2】:

一个 awk 版本:

 awk '/foo/x++ x==4sub(/foo/,"&some_text")1' file

示例:

kent$  cat file
foo
foo
trash
foo
trash
foo
foo
foo

kent$  awk '/foo/x++ x==4sub(/foo/,"&some_text")1' file
foo
foo
trash
foo
trash
foosome_text
foo
foo

【讨论】:

以上是关于使用 sed 在第 N 个匹配模式之后插入一些文本的主要内容,如果未能解决你的问题,请参考以下文章

sed / awk - 使用模式匹配后插入空格

Sed 实记 · laoless‘s Blog

sed常见用法总结

Sed - 在两个字符串之间的匹配模式后插入带文本的行

sed编辑命令

sed原理的一些感悟