2017-06-19 22 views
0

我有以下的正則表達式:匹配在Perl的正則表達式第一端支架

perl -pi -w -e "s/(\bgetnitemc)\(([^,]+),([^,]+)\)/\$1\(\$2,\$3,1,1,''\)/g;" d_*.sas 

它具有以下影響(git的差異):

-    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,''); 

所以對於第一線的行爲正在按期望。但是,在第二行中,我試圖添加的部分(,1,1,'')應用於包裝函數(insertc),而不是目標函數(getnitemc)。如果你能看到我的意思,那就是'跳過一個括號'。

我哪裏錯了?

回答

1

找到了!所以我認爲反運算符(^)爲包含在捕獲端部支架..

解決方案:

perl -pi -w -e "s/(\bgetnitemc)\(([^,]+),([^,)]+)\)/\$1\(\$2,\$3,1,1,''\)/g;" d_*.sas 

[^,)]

-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+