Strawberry Perl - 在 Windows 中搜索和替换

Strawberry Perl - Search and replace in Windows

我正在尝试执行以下命令:

perl -pi -e 's,vaadin-element,color-picker,g' *.* demo/* test/* src/* theme/*/*
(遵循 this 文档)

不幸的是,我使用的 pearl 的 window 发行版的命令似乎有一些问题,因为我收到以下错误:

Can't open *.*: Invalid argument.
Can't open demo/*: Invalid argument.
Can't open test/*: Invalid argument.
Can't open src/*: Invalid argument.
Can't open theme/*/*: Invalid argument.

关于如何解决这个问题有什么建议吗? 提前致谢!

免责声明:我以前从未使用过珍珠,也完全没有经验。

在 Unix-derived 操作系统中,shell 像 *.* 一样扩展了 glob,并将命令行作为字符串数组提供给程序。

在Windows中,命令行是一个字符串,由程序来解释它的含义,包括引号字符和globs。如果程序是普通的 C 程序,C 运行时解释命令行,扩展 glob,并将字符串数组传递给 main。这是因为 C 标准要求这样做。

但是 Perl 不是 C。使用 File::Glob 库来扩展参数。

在 unix 系统中,shell 扩展 glob 并将文件名传递给程序。

$ perl -e'CORE::say for @ARGV' *
file1
file2

另一方面,Windows shell 按原样传递值,并让程序根据需要将它们视为 glob。

>perl -e"CORE::say for @ARGV" *
*

您可以按如下方式执行通配:

>perl -MFile::DosGlob=glob -e"BEGIN { @ARGV = map glob, @ARGV } CORE::say for @ARGV" *
file1
file2

通常不需要 BEGIN 块,但它会确保在使用 -n-p 暗示)时足够早地通配一次。

-MFile::DosGlob=glob 使 glob 具有 Windows-like 语义。例如,它会导致 *.* 匹配所有文件,即使它们不包含 ..

综合:

perl -i -MFile::DosGlob=glob -pe"BEGIN { @ARGV = map glob, @ARGV } s,vaadin-element,color-picker,g" *.* demo/* test/* src/* theme/*/*