如何在发现匹配后让sed附加一行文字两行?
例如:
text0
text1
text2
text3
在我匹配text0
后,我想在下一行后追加text4
,即:
text0
text1
text2
text4
text3
答案 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
打印结果