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

时间:2018-11-18 11:32:04

标签: perl sed

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
}

2 个答案:

答案 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();