用于修改数百个文件中的php数组元素的脚本

时间:2013-12-09 12:25:35

标签: php bash shell sed awk

我有一些严重弃用的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,但有任何建议吗?

2 个答案:

答案 0 :(得分: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 $]

显然我的输入文件有点人为。如果这对您不起作用,请随时发布一些真实的输入。

答案 1 :(得分: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

编辑:更改正则表达式以反映变量数组名称。