我有以下正则表达式:
perl -pi -w -e "s/(\bgetnitemc)\(([^,]+),([^,]+)\)/\$1\(\$2,\$3,1,1,''\)/g;" d_*.sas
具有以下影响(git diff):
- if getnitemc(l_sub2,'OBJTYPE') = 'SLIST' then
- l_tempa = insertc(l_tempa,getnitemc(l_sub2,'OBJNAME'));
+ if getnitemc(l_sub2,'OBJTYPE',1,1,'') = 'SLIST' then
+ l_tempa = insertc(l_tempa,getnitemc(l_sub2,'OBJNAME'),1,1,'');
因此第一行的行为正在按预期工作。但是,在第二行中,I尝试添加(,1,1,''
)的部分应用于包装函数(insertc
)而不是目标函数(getnitemc
)。它有点跳过一个支架'如果你能看出我的意思。
我哪里错了?
答案 0 :(得分:1)
^
)在捕获中包含了结束括号..
解决方案:
perl -pi -w -e "s/(\bgetnitemc)\(([^,]+),([^,)]+)\)/\$1\(\$2,\$3,1,1,''\)/g;" d_*.sas
([^,)]
)
答案 1 :(得分:-1)
简单的解决方案是从)
的参数列表中排除getnitemc
。您需要匹配现有参数的所有内容是[^)]*
。
经过一些清理,你得到了
perl -i -wpe's/\b(getnitemc\([^)]*)/$1,1,1,\x27\x27/g' d_*.sas
或
perl -i -wpe's/\bgetnitemc\([^)]*\K/,1,1,\x27\x27/g' d_*.sas # 5.10+