sed替换为引号和通配符
我需要用sed替换为引号和通配符,sed,wildcard,substitution,Sed,Wildcard,Substitution,我需要用if(isset($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\==1)替换 (我使用*作为通配符) 我尝试了sed-I“s/if($\u SESSION['POST']['.*]]/if(isset($\u SESSION['POST']['.'.*])和&$\u SESSION['POST']['.*]/g”*.php和其他一些变体,但都没有成功。接下来 sed "s/\(if (\)\
if(isset($\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\==1)替换
(我使用*
作为通配符)
我尝试了sed-I“s/if($\u SESSION['POST']['.*]]/if(isset($\u SESSION['POST']['.'.*])和&$\u SESSION['POST']['.*]/g”*.php
和其他一些变体,但都没有成功。接下来
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
}
顺便说一句,如果您使用扩展regexp模式(-r
或-E
),它会使命令缩短几个字符。在扩展模式下,包围捕获组的括号不必转义,但文字组需要转义,因此您的命令将是:
sed -r "s/(if \()(\$_SESSION\['POST']\['([^']*)'])==1/\1isset(\2) \&\& \$_SESSION['POST']['\3']==1/" file
此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){
s=“如果(\$\u会话['POST']['name']==1){”
sed-r的/(if+)\(([^=]+)[^\]+)/\1(isset(\3)\&&&\2/')这里是另一个
这是我们需要生产的:
Pattern: if (\$_SESSION\['POST'\]\['\([^']*\)'\]
Replacement: if (isset($_SESSION['POST']['\1']) \&\& $_SESSION['POST']['\1']
在外壳级别引用时:
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(\\$U会话\['POST'\]\['\([^']*\)\)\];if(isset(\$U会话['POST']['\1'])\&\\&\$U会话['POST'['\1'])g“EOF
如果(isset($_会话['POST']['ABC'])&&&$_会话['POST']['ABC']==1){
非常感谢!这就是我最后用来进行全局替换的sed-I“s/\(if(\)\(\$\u SESSION\['POST']\['\([^']*\)]\)/\1isset(\2)\&\&\$\u SESSION['POST']['\3']/g”*.php
没问题,看起来不错。请注意,除非您希望在同一行上看到多个if
语句,否则不需要全局g
修饰符。