如何使用sed在一个模式后插入一行,并在模式1中的单词第一次出现之前插入另一行


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();插入到结束分隔符之前。

最新更新