Answers:
echo ... | sed -e '3a test' -e '5a test'
如果操作比这种情况更复杂,则可以使用如下结构:
sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'
也就是说,您将所需的所有命令放在b pattern;
和之间b end;
。
然后在之后添加所有模式(行号或其他内容): pattern;
。
这是怎么回事:
第一个命令会跳过动作部分(如果模式位于b end;
动作部分的开头和紧前面,则可能更容易阅读)。
如果模式匹配,则执行跳转到动作部分。动作部分执行后跳到最后。
我尝试整理一下:
sed '3b action; 5b action; b end; : action; a \
lalala
: end'
在一行中将是这样的:
sed "3b idAction; 5b idAction; b; : idAction; a test"
可移植地,您需要编写它:
sed '
3b action
5b action
b
: action
a\
lalala'
(b
没有标签的末尾分支,因此您不需要显式end
标签,;
在标准sed
实现中,标签中的字符是有效的)。
与sed
(请参阅@HaukeLaging的答案)
与awk
:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | awk 'NR==3 || NR==5{$0=$0"\ntest"}1;'
与perl
:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | perl -pe '$_ .="test\n" if $. == 3 || $. == 5'
perl -lnE 'say if $. ~~ @{[3,5]}'
~~
,对它的理解不如我应有的好。此外,无论是say
和~~
需要的perl V> = 5.10吗?
perl -pE 'say "test" if $. ~~ @{[4,6]}'
-该预规划线路:Perl的-p
执行一个隐含的打印在年底给定的程序。