为什么这个 perl 脚本给出的结果与 git-for-windows 和 Linux 的 windows 子系统不同?

为什么这个 perl 脚本给出的结果与 git-for-windows 和 Linux 的 windows 子系统不同?

通过 git-for-windows 与通过 Windows 脚本主机(来自 VBA 模块)执行相同的 perl 脚本时,我得到不同的结果。

Perl 命令是:

perl -pi -e 's/\bxlYes\b([^(\n|\r|\x27]*)/1$1 \x271=xlYes;/' -- *.*

其目的是用给定常量的长值替换给定常量,然后附加信息性注释。

上面的命令可以从 git-for-windows 完美执行。例如这行代码:

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , xlYes)

...(正确地)变成这样:

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , 1) '1=xlYes;

当通过 Windows 脚本宿主(来自 VBA)执行相同的命令时,我需要按如下方式包装命令:

bash -c "perl -pi -e 's/\bxlYes\b([^(\n|\r|\x27]*)/1$1 \x271=xlYes;/' -- *.*"

然而,当我这样做时,同一行代码:

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , xlYes)

...(错误地)变成这样:

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , 1 '1=xlYes;

(注意缺少的右括号)。

会不会是版本问题?


git-for-windows:bash 版本 4.4.23(1)-release;适用于 Linux 的perl v5.30.2
windows 子系统:bash 版本 4.4.20(1)-release; Perl v5.26.1

(如果这不是解决此问题的正确论坛,请原谅我。)

答案1

感谢@ruud - 它应该[^\n\r\x27]代替[^(\n|\r|\x27]

感谢@Rakesh Sharma -$1在双引号包装器中转义 成功了。

生的:

perl -pi -e 's/\bxlYes\b([^\n\r\x27]*)/1$1 \x271=xlYes/' -- basAggregate.bas

带包装:

bash -c "perl -pi -e 's/\bxlYes\b([^\n\r\x27]*)/1\$1 \x271=xlYes/' -- basAggregate.bas"

非常感谢大家的帮助!

相关内容