SED 追加到下第 n 行,而不是追加到下一行

SED append on next n-th line, not append to next line

我怎样才能让 sed 在找到匹配后两行追加一些文本?

例如:

text0
text1
text2
text3

在我匹配 text0 之后,我想在下 2 行之后附加 text4,即:

text0
text1
text2
text4
text3

我会说:

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 } .

或者,您可以使用

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

这避免了使用有点笨拙的 a 命令,但需要您在替换文本中转义某些元字符(例如 \&)。

Perl 解决方案:

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

如果要在输入结束后附加字符串,您可能需要进行更多调整。

说明:

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

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

我会为此使用 awk:

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

找到模式后,将f设置为当前行号。
f 为真且两行后 f && NR==f+2 添加新文本 [=15=]=[=15=]RS"text4".
1 打印结果