我需要将if ($_SESSION['POST']['*']==1){
替换为if (isset($_SESSION['POST']['*']) && $_SESSION['POST']['*']==1){
(我使用*
作为外卡)
我已尝试sed -i "s/if ($_SESSION['POST']['.*']/if (isset($_SESSION['POST']['.*']) && $_SESSION['POST']['.*']/g" *.php
以及其他一些变体而没有成功。
答案 0 :(得分:2)
这里......
sed "s/\(if (\)\(\$_SESSION\['POST']\['\([^']*\)']\)==1/\1isset(\2) \&\& \$_SESSION['POST']['\3']==1/" file
使用双引号表示必须转义$
符号,否则它们将被解释为shell变量。方括号需要转义,否则它们将被解释为范围的开头。可以将结束的方括号保留原样。
为了捕获密钥,我使用了一个字符类[^']*
。这意味着零个或多个字符不是单引号。
在替换中,使用\1
,\2
等引用捕获的组(匹配中括号内的部分)。
测试出来:
$ cat file
if ($_SESSION['POST']['foo']==1){
// do something
}
if ($_SESSION['POST']['bar']==1){
// do something else
}
$ sed "s/\(if (\)\(\$_SESSION\['POST']\['\([^']*\)']\)==1/\1isset(\2) \&\& \$_SESSION['POST']['\3']==1/" file
if (isset($_SESSION['POST']['foo']) && $_SESSION['POST']['foo']==1){
// do something
}
if (isset($_SESSION['POST']['bar']) && $_SESSION['POST']['bar']==1){
// do something else
}
顺便说一下,如果使用扩展正则表达式模式(-r
或-E
),它会使命令缩短几个字符。在扩展模式下,包含捕获组的括号不必转义,但是文字转义,因此您的命令将是:
sed -r "s/(if \()(\$_SESSION\['POST']\['([^']*)'])==1/\1isset(\2) \&\& \$_SESSION['POST']['\3']==1/" file
答案 1 :(得分:0)
此sed
应该有效:
s="if (\$_SESSION['POST']['name']==1){"
sed -r 's/(if +)\((([^=]+)[^\)]+)/\1(isset(\3) \&\& \2/' <<< "$s"
if (isset($_SESSION['POST']['name']) && $_SESSION['POST']['name']==1){
PS:在OSX上使用sed -E
代替sed -r
。
答案 2 :(得分:0)
这是另一个。
这是我们需要制作的:
Pattern: if (\$_SESSION\['POST'\]\['\([^']*\)'\]
Replacement: if (isset($_SESSION['POST']['\1']) \&\& $_SESSION['POST']['\1']
在shell级引用时:
Pattern: "if (\\\$_SESSION\['POST'\]\['\([^']*\)'\]"
Replacement: "if (isset(\$_SESSION['POST']['\1']) \\&\\& \$_SESSION['POST']['\1']"
把它放在一起:
sed -i "s|if (\\\$_SESSION\['POST'\]\['\([^']*\)'\]|if (isset(\$_SESSION['POST']['\1']) \\&\\& \$_SESSION['POST']['\1']|g" file
测试:
# sed "s|if (\\\$_SESSION\['POST'\]\['\([^']*\)'\]|if (isset(\$_SESSION['POST']['\1']) \\&\\& \$_SESSION['POST']['\1']|g" <<'EOF'
> if ($_SESSION['POST']['ABC']==1){
> EOF
if (isset($_SESSION['POST']['ABC']) && $_SESSION['POST']['ABC']==1){