我有许多 PHP 文件,我需要在每个以“L::”开头的常量中添加结尾“()”,而这些常量没有结尾“(”。它应该应用于所有 *.php,包括子文件夹):
L::WHAT_EVER
<?=L::WHAT_EVER?>
应该变成:
L::WHAT_EVER()
<?=L::WHAT_EVER()?>
但不要碰其中任何一个:
L::WHAT_EVER()
L::WHAT_EVER('aaa')
L::WHAT_EVER($a, $b)
我可以应用任何 sed regex 命令来实现此目标吗?
答案1
使用以下方法更容易perl
:
perl -pi -e 's/\bL::\w++\K(?!\()/()/g' ./*.php
\bL::
:L::
遵循字边界(以避免替换NIL::Foo
)。\w
:任何单词字符(ASCII 字母、数字或下划线)++
:一个或多个(s\w
),但不要回溯\K
:设置匹配部分的开头(就在该单词之后)(?!...)
:否定前瞻断言。因此,只有当后面的内容不是 时,这里才匹配(
。
答案2
Perl 和更好的正则表达式引擎更容易,因为它具有环视功能,用于 GNU sed 测试:
sed -E 's/(\w+::\w+)([^(].+)?/\1()\2/' ./*.php
求解递归glob过程:
find . -iname '*.php' -exec sed -E 's/(\w+::\w+)([^(].+)?/\1()\2/' '{}' +
对于其真正的编辑,添加 -i 选项,
find . -iname '*.php' -exec sed -i -E 's/(\w+::\w+)([^(].+)?/\1()\2/' '{}' +