Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sed替换为引号和通配符_Sed_Wildcard_Substitution - Fatal编程技术网

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
修饰符。