通过 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"
非常感谢大家的帮助!