我的问题是:我尝试使用以下命令更改多个脚本中的所有标签( <?
to ):<php?
find . -name "*.php" -type f -print0 | xargs -0 sed -i -e 's/<? /<?php /g'
问题是,如果我有这样的标签会<?echo'Ble bla..';
忽略它并且不会改变。我建议做什么?
我的问题是:我尝试使用以下命令更改多个脚本中的所有标签( <?
to ):<php?
find . -name "*.php" -type f -print0 | xargs -0 sed -i -e 's/<? /<?php /g'
问题是,如果我有这样的标签会<?echo'Ble bla..';
忽略它并且不会改变。我建议做什么?
您可以使用以下 sed 命令:
find -type f -name "*.php" -exec sed -i ':a;N;$!ba;s/<?\([ \n]\|echo\)/<?php \1/g' {} \;
它匹配空格或换行符或echo
之后的术语<?
,然后将其替换为<?php<match_found>
请注意,您不需要xargs
调用。您可以简单地使用find
'-exec
选项。此外,只要您只使用一个表达式,就不需要该-e
选项。sed
标准也-type
应该在-name
选项之前。否则 find 会抛出警告。
你总是可以用 PHP 做到这一点:
#!/usr/bin/php
<?php
foreach (glob("./*.php") as $fn) {
$data = file_get_contents($fn);
$data = preg_replace("/<\?php/", "<?", $data);
$data = preg_replace("/<\?[\b\n\s]*/", "<?php ", $data);
file_put_contents("./$fn", $data);
}