unix命令行中的复杂查找和替换

时间:2013-03-08 17:12:47

标签: regex perl unix command-line command

我正在尝试使用find and replace in multiple files on command line中提供的答案通过unix命令行对所有文件进行复杂的查找和替换,但我似乎无法找到并替换正确转义的字符串。

我需要查找包含以下内容的所有行:

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.

如何让这个替换工作?

2 个答案:

答案 0 :(得分: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 :(得分:2)

使用双引号并双重转义$有效:

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

一种更短但更脏的解决方案,带有后视和前瞻断言:

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