我正在尝试查找并替换所有旧式PHP开放代码:<?
和<?=
。我尝试了几件事:
查找所有<?
个字符串并将其替换为<?php
并忽略XML
sudo grep -ri "<?x[^m]" --include \*.php /var/www/
这不会返回任何结果,因此使用<?x
打开的所有标记都是XML开始标记,应该被忽略。
然后我对以<?p
开头但不是<?php
sudo grep -ri "<?p[^h]" --include \*.php /var/www/
这返回了我手动编辑的一个页面 - 因此不再返回结果。所以我可以确定以<?p
开头的标签都是<?php
,而x和xml也是如此。
sudo grep -ri "<?[^xp]" --include \*.php /var/www/
查找不应替换的更多开场标记
从这里开始,我可以运行上面的命令,看看会出现什么:空格,制表符,换行符,=
和{
(可以忽略)。我认为\s
会处理空白,但我仍然会得到很多结果。
尝试此操作会产生包含标签的无穷无尽的列表:
sudo grep -ri "<?[^xp =}\t\n\s]" --include \*.php /var/www/
所以最后这没用。我无法扫描数千行。这个表达有什么问题?如果某个地方<?jsp
存在且不应该被替换,我想知道这一点,将其排除,然后再获取一个较短的列表,并重复此操作直到列表为空。这样,我确定我不会更改不应该更改的标签。
更新:^ M
如果我在Vim中打开结果,我会看到^M
,这是一个换行符。这可以通过命令行直接粘贴以下内容,其中^M
位于下面的代码中:使用 Ctrl + V , Ctrl + M 到enter a literal Carriage Return character into your grep string。这将结果减少到1000行。
sudo grep -ri "<?[^xp =}\t\n\s^M]" --include \*.php /var/www/
替换旧标记
如果这个表达式有效,我想运行一个sed命令并用它来替换旧的开始标记。
<?
应该成为<?php
(带有结尾空格)<?=
应该成为<?php echo
(带有结尾空格)这将导致一个或多个这样的命令,首先替换<?
,然后替换<?=
。
sudo find /var/www/ -type f -name "*.php" -exec sed -i 's/<?[^xp=]/<?php /g' {} \;
sudo find /var/www/ -type f -name "*.php" -exec sed -i 's/<?=/<?php echo /g' {} \;
问题
^M
字符。 答案 0 :(得分:0)
我刚刚用一些文件做了一个小的Perl测试......似乎工作正常。这不是为你做的伎俩吗?
shopt -s globstar # turn on **
perl -p -e 's/<\?=/<php echo/g;s/<\?/<php/g' so-test/**/*.php
so-test
。-i.bak
之前添加-e
选项以创建备份文件。-i
(不包含.bak
)以影响文件。如果没有-i
,结果将打印到控制台而不是写入文件。适合测试!