Linux SED搜索每行替换多个

时间:2011-04-29 18:11:25

标签: php regex search replace sed

我需要在客户端网站中使用PHP函数替换掉一大堆PHP超级全局变量,以便从xss攻击中清除超级全局。

以下是原始代码的样子:

echo $_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2'];

我需要它看起来像这样:

echo MYCLASS::myfunction($_REQUEST['HELLO1']) . ' AND ' . MYCLASS::myfunction($_REQUEST['HELLO2']);

主要问题,我需要对超过100个文件进行搜索/替换!糟糕!

所以我的解决方案就是这个(在linux shell中):

sudo sed -i 's/\$_REQUEST[.*\]/MYCLASS::myfunction(&)/g' *.php

这很好用 - 因为每行只发生一个“$ _REQUEST”实例...但是有多个实例,它会搞砸并执行此操作:

echo MYCLASS::myfunction($_REQUEST['HELLO1'] . ' AND ' . $_REQUEST['HELLO2']);

5 个答案:

答案 0 :(得分:2)

问题在于.*是贪婪的,并且会找到尽可能长的匹配。要解决这个问题,请使用[^]]*,以免不小心抓住一组额外的方括号。

sudo sed -i 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g' *.php

在其他正则表达式方言中,您也可以编写.*?以使通配符不贪婪,但这似乎不适用于sed(至少在我的版本中没有,甚至不在sed -r )。

答案 1 :(得分:1)

在Perl中,以下脚本将在您向脚本传递您感兴趣的文件名称的位置 假设脚本是t.pl,你的文件是file.php
输出回file.php
perl t.pl file.php> file.php
输出到另一个文件,这样就不会覆盖原来的文件 perl t.pl file.php> another_file.php

#!/usr/bin/perl

$FILE_NAME = $ARGV[0];

open (FILE_NAME) or die ("Could not open FILE_NAME information file: $FILE_NAME \n");
@file_contents = <FILE_NAME>;
close (FILE_NAME);


foreach $line (@file_contents) {
       chomp($line);
       $line =~ s/\$_REQUEST\[.*?\]/MYCLASS\:\:myfunction\($&\)/g;
       print $line." \n";
}

出口;

答案 2 :(得分:1)

尝试使用此sed命令:

sed -i.bak 's/\$_REQUEST\[\([^]]*\)\]/MYCLASS::myfunction(\1)/g' *.php

或perl:

perl -pe 's/\$_REQUEST\[([^]]*)\]/MYCLASS::myfunction(\1)/g' file.php

答案 3 :(得分:1)

sed 's/\$_REQUEST\[[^]]*\]/MYCLASS::myfunction(&)/g'

答案 4 :(得分:0)

这应该这样做:

sed -i "s/\$_REQUEST\[\([^\x5d]*\)\]/MYCLASS::myfunction(\1)/g" *.php

我在匹配]时遇到了很多麻烦,所以我用\x5d进行了抨击。

相关问题