perl表达式查找&替换以修改外部函数定义

时间:2017-06-17 19:48:22

标签: perl

是否可以使用perl从函数定义中删除参数?例如,如果我的文件包含以下文字:

var1 = myfunc(sss,'ROW DRILL',1,1,0);
var2 = myfunc(fff,'COL DRILL',1,1,0);
var3 = myfunc(anyAlphaNum123,'anyAlphaNum123 or space',1,1,0);
donotcapture=myfunc2(rr,'some string',1,1,0); 

我需要改变它以便它变成:

var1 = myfunc(sss,'ROW DRILL');
var2 = myfunc(fff,'COL DRILL');
var3 = myfunc(anyAlphaNum123,'anyAlphaNum123 or space');
donotcapture=myfunc2(rr,'some string',1,1,0);

基本上只是从调用,1,1,0的所有实例中删除myfunc,但保留前两个参数。

我尝试了以下方法,但这种方法意味着我必须为每个排列编写规则......

perl -pi -w -e "s/myfunc\(rr,'COL SUBSET',1,1,0\)/myfunc\(rr,'COL SUBSET'\)/g;" *.txt

1 个答案:

答案 0 :(得分:2)

  • 为了降低复杂性,使用灵活的正则表达式来推广正则表达式。
    • (,之间的任何内容的正则表达式,,除外:\(([^,]+),
    • ''之间的任何内容的正则表达式,'除外:\'([^']+)\'
  • 为了使输出适合特定输入(尽管有灵活性),
    使用捕获组,即(...) 它们填充变量,您可以在替换中将其用作$1
  • 要防止匹配函数的名称以函数名称结尾,例如notmyfunc()
    使用正则表达式进行单词边界,即\b
  • Ikegamis编辑(分开以保持可见,你和我学到了很多困难):
    • 避免使用程序参数的双引号 它只是在寻找麻烦,需要额外的逃避 请注意,在双引号或正则表达式文字中使用时,\x27是单引号 \' - > \x27
    • 仅使用一个捕获组(myfunc\([^,]+,\x27[^\x27]+\x27)
    • 删除;,这是单个语句不需要的。
    • 在输入文件通配符中添加.,假设您实际上是这样的。

工作代码
(比较聊天记录\((;反斜杠丢失了,我相信聊天吃掉了。):

perl -pi -w -e "s/(\bmyfunc)\(([^,]+),\'([^']+)\'(?:,\d+){3}\)/\$1\(\$2,\'\$3\'\)/g;" *txt

Ikegamis很好编辑
(在我们的聊天中非常耗时的细节不再容易看到,
因为捕获组的(被移动到其他地方。):

perl -i -wpe's/\b(myfunc\([^,]+,\x27[^\x27]+\x27)(?:,\d+){3}\)/$1)/g' *.txt

输入:

var1 = myfunc(sss,'ROW DRILL',1,1,0);
var2 = myfunc(fff,'COL DRILL',1,1,0);
var3 = myfunc(s,'ROW SUBSET',1,1,0);
var4 = myfunc(rr,'COL SUBSET',1,1,0);
var5 = myfunc(rr,'COL SUBSET',2,12,50); with different values
var6 = notmyfunc(rr,'COL SUBSET',1,1,0); tricky differet name
var1 = myfunc(sss,'ROW DRILL',1,1,0);
var2 = myfunc(fff,'COL DRILL',1,1,0);
var3 = myfunc(anyAlphaNum123,'anyAlphaNum123 or space',1,1,0);
donotcapture=myfunc2(rr,'some string',1,1,0);

输出(版本“更放松”):

var1 = myfunc(sss,'ROW DRILL');
var2 = myfunc(fff,'COL DRILL');
var3 = myfunc(s,'ROW SUBSET');
var4 = myfunc(rr,'COL SUBSET');
var5 = myfunc(rr,'COL SUBSET'); with different values
var6 = notmyfunc(rr,'COL SUBSET',1,1,0); tricky differet name
var1 = myfunc(sss,'ROW DRILL');
var2 = myfunc(fff,'COL DRILL');
var3 = myfunc(anyAlphaNum123,'anyAlphaNum123 or space');
donotcapture=myfunc2(rr,'some string',1,1,0);

经验教训:

  • 我养成了创建正则表达式的习惯,尽可能紧密地输入输入 但是,当没有经验的正则表达式的人应用于样本输入时,这让我们/我毫无准备。 (绝对不会责怪你。)
  • 将代码引用发布到聊天中很危险,请注意\