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

Regex unix命令行中复杂的查找和替换,regex,perl,unix,command-line,command,Regex,Perl,Unix,Command Line,Command,我试图使用中提供的答案,通过unix命令行在所有文件中执行复杂的查找和替换,但似乎无法正确转义查找和替换字符串 我需要找到包含以下内容的所有行: if ($session['test']>0){ 并将其替换为 if ($session['test']>1){ 我正在尝试的命令是: find . -name '*.php' |xargs perl -pi -e 's/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'

我试图使用中提供的答案,通过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.

正则表达式中的
不匹配);标记为只需使用双引号:

perl -pi -e "s/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g"
此外,如果
,则在
之后缺少一个空格,美元符号需要用三个反斜杠转义:

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

只需使用双引号:

perl -pi -e "s/if\(\$session\[\'test\'\]\>0\){/if\(\$session\[\'test\'\]\>1\){/g"
此外,如果
,则在
之后缺少一个空格,美元符号需要用三个反斜杠转义:

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

使用双引号和双转义
$
可以:

perl -pi -e "s/if \(\\\$session\['text'\]>0\){/if (\\\$session['text']>1){/"
一个更短但更脏的解决方案,具有向后看和向前看的断言:

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

使用双引号和双转义
$
可以:

perl -pi -e "s/if \(\\\$session\['text'\]>0\){/if (\\\$session['text']>1){/"
一个更短但更脏的解决方案,具有向后看和向前看的断言:

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

命令不会“思考”。它们知道。当shell插值出现问题时,只需使用一个文件保存正则表达式并运行
xargs perl-pi file.pl
命令不会“思考”。他们知道。当shell插值是一个问题时,只需使用一个文件来保存regex并运行
xargs perl-pi file.pl
,使用双引号会成功运行命令,但无法实现我想要的替换。使用双引号会成功运行命令,但无法实现我想要的替换。