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.

我如何让这个替代品工作?

4

2 回答 2

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"
                 ^  ^^^                                ^^^
于 2013-03-08T17:16:01.217 回答
2

使用双引号和双重转义$作品:

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

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

perl -pi -e 's/(?<=if \(\$session\[.text.\]>)0(?=\){)/1/'
于 2013-03-08T17:27:59.893 回答