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

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

【问题讨论】:

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

标签: sed matching


【解决方案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==4{sub(/foo/,"&some_text")}1' file

示例:

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

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

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2021-02-13
    • 2012-07-11
    • 2018-11-13
    相关资源
    最近更新 更多