2013-03-08 47 views
0

我試圖做一個複雜的查找和通過UNIX命令行使用find and replace in multiple files on command line提供了答案的所有文件替換,但我似乎無法讓我的查找和替換字符串正確轉義。複雜的查找和替換

我需要找到一個包含所有行:

if ($session['test']>0){ 

if ($session['test']>1){ 

命令我試圖取代它的是:

find . -name '*.php' |xargs perl -pi -e 's/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g' 

但是,這給了我另一個提示需要我輸入一個額外的'角色,因爲命令告訴我那裏是一個缺少終止的字符串。如果我把它放在額外'末,我得到:

Unmatched) in regex; marked by <-- HERE in m/if\(\$session\[\test']>0) <-- HERE {/ at -e line 1. 

我如何得到這個更換工作?

+1

命令不「思考」。他們知道*。 – alestanis 2013-03-08 17:13:55

+0

當shell插值是一個問題時,只需使用一個文件來保存你的正則表達式並運行'xargs perl -pi file.pl' – TLP 2013-03-08 17:25:47

回答

2

只需使用雙引號:

perl -pi -e "s/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g" 

而且,你if後缺少空間和美元符號需要用三個反斜槓進行轉義:

perl -pi -e "s/if \(\\\$session\[\'test\'\]\>0\){/if \(\\\$session\[\'test\'\]\>1\){/g" 
       ^^^^        ^^^ 
+1

使用雙引號可以成功運行該命令,但不會實現我想要的替換。 – nmc 2013-03-08 17:18:08

+0

@nmc我編輯過,看看 – alestanis 2013-03-08 17:28:28

2

使用雙引號和雙逃逸$作品:

perl -pi -e "s/if \(\\\$session\['text'\]>0\){/if (\\\$session['text']>1){/" 

具有後視和前瞻斷言的較短但較髒的解決方案:

perl -pi -e 's/(?<=if \(\$session\[.text.\]>)0(?=\){)/1/'