我正在尝试使用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.
如何让这个替换工作?
答案 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/'