sub tc1 {
a
b
c
d
endcase
}
sub tc2
{
a
b
c
endcase
}
我想在sub-tc1之后调用一个子程序,比如start((,在sub-tc1的结束情况之前调用stop((
我用了这个命令
perl -i.bak -pe 'BEGIN{undef $/;} s/(subs+TC1[sn]+{)(.*)endcase/$1n&start();$2&stop();nendcase/smg' file.txt
输出
sub tc1 {
&start();
a
b
c
d
endcase
}
sub tc2
{
a
b
c
stop();
endcase
}
但它正在修改最后匹配的尾数模式
预期输出
sub tc1 {
&start();
a
b
c
d
&stop();
endcase
}
这应该是awk
的一项简单任务,如果您对awk
满意,请尝试以下操作。
awk '
/sub tc1/{
sub_tcl_val=$0 ORS "&start();"
flag=val=""
next
}
/endcase/ && ++count==1{
flag=1
print sub_tcl_val ORS val ORS "&stop()" ORS $0 ORS "}"
val=sub_tcl_val=""
next
}
!flag{
val=val?val ORS $0:$0
}' Input_file
输出如下。
sub tc1 {
&start();
a
b
c
d
&stop()
endcase
}
这可能对你有用(GNU sed(:
sed -e '/sub tc1/,/endcase/!b;/sub tc1/a&start();' -e '/endcase/i&stop();' file
在本例中,使用范围来关注起始/结束分隔符sub tc1
/endcase
。然后将字符串&start();
追加到起始分隔符之后,并将字符串&stop();
插入到结束分隔符之前。