2017-10-06 96 views
1

替换代码,我有一个大的PHP脚本,包含以下行SED中找到/ PHP脚本

$user = $_REQUEST['user'];

的精确匹配只能在整个页面中出现一次。我想将其更改为

$user = urldecode($_REQUEST['user']);

能有人建议最好的方法是什么? 我在想SED,但是我试过的一切都找不到并取代它。

任何想法?

感谢

+1

添加您尝试过的代码...也会建议在整行上使用awk字符串匹配,以避免必须照顾元字符 – Sundeep

回答

0

sed的方法:

sed -E "s/^(\\\$user =)(\\\$_REQUEST\['user'\])/\1urldecode(\2)/" file.php 
+0

感谢但值$ user ='出现了几次该页面,作为'$ user = $ _REQUEST ['user'];'只出现一次。 – Tom

+0

@Tom,看我的更新 – RomanPerekhrest

0

以下应该可以帮助你一样。

sed 's/^$user = $_REQUEST\['"'"'user'"'"'\]\;$/$user = urldecode($_REQUEST\['"'"'user'"'"'\]);/' Input_file 

比方说,下面是Input_file(我在这里假设)。

cat Input_file 
^@^@^@^@00000305^@^@^@^@^@^@430^@430^@^@^@^@^@^@^@^@^@09079989530 
$user = $_REQUEST['user']; 
tefqfwqfb$user = $_REQUEST['user']; 
wvwrjvnwvjn$user = $_REQUEST['user'];fwvwrev 

因此,运行上面的代码后,将输出。

sed 's/^$user = $_REQUEST\['"'"'user'"'"'\]\;$/$user = urldecode($_REQUEST\['"'"'user'"'"'\]);/' Input_file 
^@^@^@^@00000305^@^@^@^@^@^@430^@430^@^@^@^@^@^@^@^@^@09079989530 
$user = urldecode($_REQUEST['user']); 
tefqfwqfb$user = $_REQUEST['user']; 
wvwrjvnwvjn$user = $_REQUEST['user'];fwvwrev 
+0

谢谢。你能建议为什么需要所有的报价和双引号。 ? – Tom

+0

@Tom,不客气。如果告诉sed我们在sed的通常''bla_bla_bla''之间有一个'''',那么这是一种方法。意思是,如果你简单地使用''bla_bla'bla_bla'',那么sed会抛出错误,因为它会认为block没有完成,所以让sed知道我们的文本在这之间已经有''''了。 – RavinderSingh13

0
$ awk 'index($0,"$user = $_REQUEST[\047user\047];") { sub(/= /,"&urldecode("); sub(/;/,")&") } 1' file 
$user = urldecode($_REQUEST['user']); 
0

这可能为你工作(GNU SED):

sed '/^$user = $_REQUEST\['\''user'\''\];$/s/$_[^;]*/urldecode(&)/' file 

匹配字符串,然后使用替代修改它的一部分。

N.B. '\''关闭当前的单引号sed命令,引入另一个单引号,然后开始sed命令的其余部分,即它打洞到shell,然后引用单引号。