【问题标题】:Inserting line between two lines having second line starting with certain pattern在两条线之间插入一条线,第二条线以某种模式开始
【发布时间】:2013-09-27 16:55:32
【问题描述】:

我想在两行之间插入一行,前提是第二行匹配某个模式

例如输入文件如下:

pattern (match 1, line 1)
line 2
line 3
line 4
line 5 (before pattern)
pattern (match 2, line 5)
line 7
line 8
line 9
line 10 (before pattern)
pattern (match 3, line 11)
line 12

我想在line 5pattern 之间以及line 10pattern 之间插入lineToInsert

我试过这个命令:

sed 'N;s/\n\(pattern\)/\n\ 
lineToInsert\n\1/'

我希望这可以工作,但它只有在匹配的模式仅存在于偶数行时才有效!

那么,我如何使用 sed 或任何其他工具/命令来实现这一点?以及为什么前面的命令不起作用?

【问题讨论】:

  • 非常一般的场景,因此很有用。 +1 简洁的解释和您的试用命令。
  • 你为什么要使用双亲?取下它们,它应该可以工作。
  • @EdsonMedina 使用括号,因为我需要再次重新插入模式,请注意第二行末尾的 \1。另请查看 Birei 和 potong 的答案,了解为什么它不起作用。

标签: regex linux bash sed


【解决方案1】:

使用 awk 你可以做这样的事情:

awk 'NR>1&&/pattern/{print "lineToInsert"}1' file

【讨论】:

  • 只需 +1 你的并删除我的,因为我在 30 秒内击败了我。 :)。顺便说一句,你的单线很好,但不适用于给定的例子。这就是为什么我在回答中写了YourPattern
【解决方案2】:

sed 有一个insert command

sed '1n; /^pattern/i line to insert'

【讨论】:

    【解决方案3】:

    您已经有了一些解决方案,但是,为什么您的解决方案不起作用?因为 读取每一行,N 读取下一行并将其附加到当前行。因此,您将每对两行保存到缓冲区中,并将替换命令应用于它们并用换行符连接。

    执行N 命令后的缓冲区将是:

    pattern\nline 2
    

    稍后:

    line 3\nline 4
    

    稍后:

    line 5 \npattern
    

    等等。

    在您的替换命令中,您在模式之前有一个换行符,因此只有当pattern 在第二行时才会成功,或者换一种说法,偶数。

    使用,您可以避免N,逐行处理文件,不用担心换行,例如:

    sed '1! s/\(pattern\)/lineToInsert\n\1/' infile
    

    它产生:

    pattern 
    line 2
    line 3
    line 4
    line 5 
    lineToInsert
    pattern 
    line 7
    line 8
    line 9
    line 10 
    lineToInsert
    pattern 
    line 12
    

    【讨论】:

      【解决方案4】:

      这可能对你有用(GNU sed):

      sed -e '$!N;/\npattern/a\insert line' -e 'P;D' file
      

      这会将 2 行读入模式空间,然后在第二行的开头查找模式。如果找到该模式,则将新行附加到第一行。它始终打印第一行,然后将其删除,从而调用$!N 而无需像 sed 通常那样自动读取新行。当模式空间中已存在换行符 (\n) 时,D 命令会覆盖自动读入新行。

      因为您没有使用 P;D 组合,所以您总是一次读取两行。

      当然,这可以更容易地使用:

      sed '1n;/^pattern/i\insert new line' file # as in Glen Jackman's answer
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多