为此,我将简化您的正则表达式,使其效果更好,但我可能错了,因为我没有在任何真实代码上对其进行测试。
假设您坐在代码的基本目录中,您可以从以下内容开始:
find . -iname "*.php" -print0
这将为您提供所有 .php 文件,由 NULL 字符分隔,如果其中任何一个有空格,这是必要的。
find . -iname "*.php" -print0 | xargs -0 -I{} sed -n 's/\(<\?\)\([^a-zA-Z]\)/\1php\2/gp' '{}'
这应该能让你大部分时间到达那里。它将找到所有文件,然后为每个文件运行 sed 以替换代码。但是,如果没有 -i 标签(在下面使用),这实际上不会触及您的文件,它只会将您的代码发送到您的终端。-n 抑制正常输出,正则表达式部分后面的 p 告诉它只打印更改的行。
好的,如果您的结果看起来正确,那么您将迈出一大步,即就地替换文件。在尝试此操作之前,您绝对应该备份所有文件!!!
find . -iname "*.php" -print0 | xargs -0 -I{} sed -i 's/\(<\?\)\([^a-zA-Z]\)/\1php\2/g' '{}'
那应该可以完成工作。不幸的是,我周围没有使用该语法的 PHP 文件,因此您只能从这里弄清楚,但希望现在完成工作的机制更加清晰:
- 使用“查找”获取所有文件
- 将该文件列表发送到“xargs”(一次对文件执行一些命令
- 使用 "sed" 和语法 's/to-change/changed/' 让你的正则表达式魔法发挥作用!