0

我的问题是:我尝试使用以下命令更改多个脚本中的所有标签( <?to ):<php?

find . -name "*.php" -type f -print0 | xargs -0 sed -i -e 's/<? /<?php /g'

问题是,如果我有这样的标签会<?echo'Ble bla..';忽略它并且不会改变。我建议做什么?

4

2 回答 2

1

您可以使用以下 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 会抛出警告。

于 2014-06-21T16:23:34.373 回答
0

你总是可以用 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);
}
于 2014-06-21T17:35:40.143 回答