sed用引号和通配符代替

时间:2014-08-16 17:06:06

标签: sed wildcard substitution

我需要将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以及其他一些变体而没有成功。

3 个答案:

答案 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){