2017-10-06 93 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,然後引用單引號。