如何在每两个连续模式匹配之前和之后添加字符串?
例如:我有一些代码如下:
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相同的缩进。
有人可以帮忙吗?
答案 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'