Perl / Sed用小写版本替换捕获组中的所有匹配项

ric*_*i90 0 php bash perl zsh sed

我需要用等价的小写字母替换php应用程序中的所有include。我正在将旧版应用程序转换为Docker,并且该应用程序是在Windows中构建的。

我已经测试了以下正则表达式

(include.+)["'](\w+\.php)["'](.*)
Run Code Online (Sandbox Code Playgroud)

我已经尝试将其放入这样的单线perl命令中

perl -p -i -e '/(include.+)[\"\'](\w+\.php)[\"\'](.*)/\1\'\L\2\'\E\3/ `find ./ -name *.php`
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误

(在'L2'之前缺少运算符??)在“ -L2'E3”附近的-e行1中,期望找到运算符的地方(在E3之前缺少运算符?)在-e第1行末尾的未知正则表达式修饰符“ / 1” -e第1行的行语法错误在“ /(include.+)[\"](w+.php)"'/1'L2'”附近-e的执行由于编译错误而中止。

我只需要将匹配的字符串替换为,$1'{lowercase $2}'$3但是我并不是一个perl或sed向导。

编辑

php的两个示例包括声明

include "something.php";
include_once "something.php";
include("SomethingElse.php");
include ('Something.php');
include_once("something.php");
include_once ("something.php");
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 6

要小写include语句中的内容,就地更改输入文件

perl -i.bak -wpe's/include.*\K (([\x22\x27]) \w+\.php \g{-1})/\L$1/x;' file
Run Code Online (Sandbox Code Playgroud)

使用带有提供的include语句的文件进行了测试。

笔记:

  • 该include.*下报价之前的名称匹配(以识别线),但随后回落\K,使我们不必捕获和复制的更换部件。有关更多信息,请参见扩展模式中的“环视断言 ” 。\K

  • 引号"和'正在使用匹配的\x22和\x27,在字符类(它的棘手与文字引号)。然后,使用(相对)后向引用来 匹配结束引号\g{-1},因此它必须与开始引号相同

  • 'AbC.php'首先捕获的整体(在中$1)用\Lsequence小写。这是可在任何内插构造中使用的少数转义之一

  • 考虑添加锚点/^\s*(带有可选空格),仅在字符串开头匹配

  • 该/x修改允许使用正则表达式的内部空间(和注释),为便于阅读

我添加了标志.bak以保持备份并-w打印警告。