每两次连续模式匹配前后添加字符串

时间:2014-09-18 09:30:26

标签: regex awk sed sh csh

如何在每两个连续模式匹配之前和之后添加字符串?

例如:我有一些代码如下:

if (a == 5) 
    `uvm_info ("some display message"); 

这里有两个连续的模式是“if”和“uvm_info”。 只有当if和uvm_info连续出现时,我才需要添加“begin”和“end”。

现在我希望输出像

if (a==5) 
   begin 
   `uvm_info ("some display message") 
   end 

如果我不必考虑使用以下命令匹配“if”模式,我可以轻松添加begin end:

awk '/`uvm_info/{print "begin"; print; print "end";next}1' test_file

但我需要注意“if”模式,如果可能的话,我想设置与uvm_info相同的缩进。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

这个正则表达式将:

s/(if[^;]+?)\s+(.*?uvm.*?);/\1\nbegin\n    \2;\nend/gm

http://regex101.com/r/mD7gK4/3

编辑: 输入:

if (a == 5) 
    `uvm_info ("some display message"); 

if (hello) 
    `uvm_info ("some display message"); 

if (answer_toeverything == 42) 
    `uvm_info ("some display message"); 

uvm_info ("some display message"); 

uvm_info ("some display message

输出:

if (a == 5) 
begin 
    `uvm_info ("some display message"); 
end 

if (hello) 
begin 
    `uvm_info ("some display message"); 
end 

if (answer_toeverything == 42) 
begin 
    `uvm_info ("some display message"); 
end 

uvm_info ("some display message"); 

uvm_info ("some display message"); 

我不知道如何处理反引号(如果在你的例子中意外)。如果你想在outout中取消这一点,你可以使用(if[^;]+?)[^;]*?(uvm.*?);作为搜索表达式(http://regex101.com/r/mD7gK4/5)。

如果你安装了perl,你可以用这种方式将这个正则表达式应用到文件中:

perl -e "$_ = join('',<>);  s/(if[^;]+?)[^;]*?(uvm.*?);/\1\nbegin\n    \2;\nend/gm; print"

这首先从stdin读取所有行并将它们连接成一个字符串,应用正则表达式并打印结果。

答案 1 :(得分:0)

对代码进行轻微调整即可

awk 'x&&/`uvm_info/{print "begin\n"$0"\nend";next}{x=0}/if/{x=1}1' file

维持缩进

awk 'x&&/`uvm_info/{$0=(y=substr($0,1,index($0,"`")-1))"begin\n"$0"\n"y"end"}{x=0}/if/{x=1}1'