2011-04-29 123 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'