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
打印结果
我怎样才能让 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
打印结果