2011-04-29 120 views
3

我在这里有doosey。我是新来的Linux外壳如此裸露与我...Linux 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']); 

我现在拉我的头发了!

任何Linux shell专家都可以帮到我希望吗?

回答

1

尝试此sed命令:

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

或在Perl:

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

这比Perl脚本快得多..谢谢! – 2011-04-29 19:49:50

+0

不客气,我向你提供了perl 1班轮以及上面的答案。 – anubhava 2011-04-29 20:03:01

+0

虽然我有一个问题,它用$ _REQUEST('')替换$ _REQUEST ['']任何想法如何解决? – 2011-04-29 20:05:35

0

这应做到:

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

我有很多的配套]麻烦,所以我和\x5d踢。

+0

我正在一个“-e表达#1,炭43:无效引用\ 1上's; command's – 2011-04-29 18:30:35

+0

尝试使它成为'/ \ $ _ REQUEST \ [\([^ \]] [^ \]] *)\]/....' – shellter 2011-04-29 19:18:33

2

问题是.*是贪婪的,并且会发现它可能的最长匹配。要解决这个问题,可以使用[^]]*来代替,这样你就不会无意中抢占一组额外的方括号。

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

在其他的正则表达式方言,你也可以写.*?使通配符非贪婪,但没有出现在工作sed的(至少在我的版本,甚至没有与sed -r)。

+0

感谢您的帮助。很有意思,答案不起作用,我们正在尝试。* ?. KS! – 2011-04-29 19:08:51

+0

看起来你的答案帮助解决了这个问题。谢谢。 – 2011-04-29 19:35:19

1

在Perl,下面的脚本将工作,你通过脚本您有兴趣
的文件名可以说剧本是t.pl和您的文件file.php
输出回文件.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"; 
} 

exit;

+0

不知道我应该得到的解决方案标记,因为我没有使用sed,但很高兴这个Perl脚本适合你。 – Troy 2011-04-29 19:35:30

1

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