使用 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 个匹配模式之后插入一些文本的主要内容,如果未能解决你的问题,请参考以下文章