2013-12-09 49 views
0

我有我篩選通過一些嚴重過時的PHP代碼的。其中之一,我有一個問題是數以百計的錯誤是這樣的:腳本修改PHP數組元素在數百個文件

[Mon Dec 09 07:00:33 2013] [error] [client 127.0.0.1] PHP Notice: Use of undefined constant id - assumed 'id' in /home/srv/site.local/content/online.php on line 171, referer: http://site.local/index.php

這些結果在調用數組的這樣一個以前的編碼器的做法:

$array[some_element] 

代替:

$array['some_element'] 

所以我知道如何通過每一個文件去和添加引號,過來,過來,一遍又一遍,以解決這個問題。我的問題是如何爲此編寫腳本。我想這可能是一個sed或awk腳本,但我不確定。一旦我完成發佈,我將開始研究sed,但有什麼建議?

+0

爲什麼你不使用任何編輯器更換** $陣列[some_element] **這個** $陣列[ 'some_element'] **? –

+0

因爲我一整天都在這裏。這是整個網站;這是一個大網站..我使用vim。它可能在vim中是腳本。不過,我確實有藍魚。我想讓我的腦袋圍繞sed和awk,但重點是完成它。好主意。我看看藍魚,看看它是否讓我做全球替代。 –

+0

此處,我在與AWK是正確的現在,看起來更適合比的sed: 'AWK '{C + =子(/\[[.*]\]/, 「[元件]」)} 1' content/testfile.php | less' 這是不太做任何事,但關鍵是要至少「打」數組元素第一。 –

回答

1

我不知道PHP的任何東西,所以我不知道這個解決方案是否是一個特別好的一個:利用

sed "s|\[[ ]*|\[\'|g;s|[ ]*\]|\'\]|g" test.in 

例如:

[fixarraysubscript $] cat test.in 
$array[some_element] 

$name1[index] 

$name2[index] 


$name3[ id ] 

$name4[ id2 ] 

[fixarraysubscript $] 
[fixarraysubscript $] sed "s|\[[ ]*|\[\'|g;s|[ ]*\]|\'\]|g" test.in 
$array['some_element'] 

$name1['index'] 

$name2['index'] 


$name3['id'] 

$name4['id2'] 

[fixarraysubscript $] 

顯然,我的輸入文件有點做作。如果這不適合你,請隨時發佈一些實際的輸入。

+0

謝謝!這碰到了更簡單的情況,並做我需要做的與他們。這可能會清除我95%的錯誤。 –

+0

好,太好了。我現在看到你的更復雜的例子,這不會正確地轉置類似的第一個外括號:$ tsms_cats [$ data ['t_s']] ['color']。我想這取決於你有多少這樣的例子... – user3065349

+0

沒錯。我剛剛運行它,它變成: $ tsms_cats ['$ data ['t_s']'] [''name''] 所以我正在處理正則表達式。我敢肯定,我可以將其限制爲單詞字符並避免這種情況。 –

0

這可能與gnu awk

echo '$array[some_element]' | awk '{print gensub(/\$([^[]+)\[([^]]+)]/,"$\\1["q"\\2"q"]","g")}' q="'" 
$array['some_element'] 

工作,爲您的文件

awk '{print gensub(/\$([^[]+)\[([^]]+)]/,"$\\1["q"\\2"q"]","g")}' q="'" file 

awk '{print gensub(/\$([^[]+)\[([^]]+)]/,"$\\1[\x27\\2\x27]","g")}' file 

編輯:改變正則表達式來反映變量數組名。

+0

「函數gensub undefined」,但我認爲正則表達式正在接近。謝謝。我可能不清楚,但是,這個語法用在大型網站上每個文件的每個數組上。另外,爲了使事情進一步複雜化,一些數組在其中有引號。我沒有看到有任何多維數組,但我敢打賭,有一些... –

+0

當然,如果我能得到一些作品一個文件我就可以把它在bash for循環讓所有... –

+0

下面是最複雜的例子,我看的更遠: '$ tsms_cats [$數據[T_S] [ '顏色']' 所以我需要弄清楚如何替換成: '$ tsms_cats [$數據[ 'T_S']] [ '顏色']' 除了更簡單的。我懷疑當我完成這些時,這將是一個bash腳本中的多個awks。 IMO還是比通過「手工」改變所有這些要好得多。 –