SED附加在下一行,不附加到下一行

时间:2015-04-08 11:35:57

标签: sed

如何在发现匹配后让sed附加一行文字两行?

例如:

text0
text1
text2
text3

在我匹配text0后,我想在下一行后追加text4,即:

text0
text1
text2
text4
text3

3 个答案:

答案 0 :(得分:2)

我会说:

sed -e '/text0/ { N; N; a text4' -e '}' filename

那是:

/text0/ {  # when finding a line that matches text0
  N        # fetch two more lines
  N
           # and only then append text4
  a text4
}

将其用作单行时,必须将其拆分为两个-e选项,以便a命令不会尝试追加行text4 }。< / p>

或者,您可以使用

sed '/text0/ { N; N; s/$/\ntext4/; }' filename

这可以避免使用稍微笨拙的a命令,但要求您在替换文本中转义某些元字符(例如\&)。

答案 1 :(得分:1)

Perl解决方案:

perl -pe 'push @append, 3 + $. if /text0/;
          shift @append, print "text4\n" if $append[0] == $.;
         ' input.txt > output.txt

如果要在输入结束后附加字符串,则可能需要进行一些调整。

说明:

  • $.是行号。
  • /text0/匹配时,附加应该发生的行号被推入数组@append。
  • 当当前行号对应于数组开头的行号时,将打印该行,并丢弃该数组的第一个元素。

这也意味着它适用于重叠匹配和附加。

答案 2 :(得分:1)

我本来会使用awk

awk '/text0/ {f=NR} f && NR==f+2 {$0=$0RS"text4"}1' file
text0
text1
text2
text4
text3

找到模式后,将f设置为当前行号 如果f为真,后两行f && NR==f+2添加新文字$0=$0RS"text4" 1打印结果