sub tc1 {
a
b
c
d
endcase
}
sub tc2
{
a
b
c
endcase
}
我想在子tc1之后调用一个子例程,例如start(),在子tc1的这种末尾之前调用stop()
我用了这个命令
perl -i.bak -pe 'BEGIN{undef $/;} s/(sub\s+TC1[\s\n]+\{)(.*)endcase/$1\n&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
}
答案 0 :(得分:0)
这应该是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
}
答案 1 :(得分:0)
这可能对您有用(GNU sed):
sed -e '/sub tc1/,/endcase/!b;/sub tc1/a\&start();' -e '/endcase/i\&stop();' file
在这种情况下,sub tc1
/ endcase
使用范围集中于开始/结束定界符。然后,在开始定界符之后附加字符串&start();
,并在结束定界符之前插入字符串&stop();
。