将括号附加到所有以 L:: 开头的常量(如果末尾不存在)

将括号附加到所有以 L:: 开头的常量(如果末尾不存在)

我有许多 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/' '{}' +

相关内容