Strawberry Perl-在Windows中搜索和替换

时间:2019-05-29 07:00:43

标签: windows perl replace strawberry-perl

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

perl -pi -e 's,vaadin-element,color-picker,g' *.* demo/* test/* src/* theme/*/*
(以下this个文档之后)

不幸的是,由于出现以下错误,看来我使用的Pearl窗口分布有一些问题:

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.

关于如何解决该问题的任何建议? 预先谢谢你!

免责声明: 我以前从未使用过Pearl,而且绝对没有经验。

2 个答案:

答案 0 :(得分:5)

在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的语义。例如,它使*.*匹配所有文件,即使它们不包含.

集成:

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

答案 1 :(得分:1)

在Unix派生的操作系统中,shell扩展了main之类的glob,并将命令行作为字符串数组提供给程序。

在Windows中,命令行是单个字符串,由程序来解释它的含义,包括引号字符和glob之类的内容。如果程序是普通的C程序,则C运行时将解释命令行,并扩展glob,然后将字符串数组传递给File::Glob。这是因为C标准要求这样做。

但是Perl不是C。使用@App:name("Http_Request_Response_Tutorial") @App:description("This app demonstrate the usage of http request sink and http response source") @source(type='http-response' ,sink.id='cardTypeSink', @map(type='xml', namespaces = "xmlns=http://localhost/SmartPayments/", @attributes(creditCardNo = 'trp:creditCardNo',creditCardType = "."))) @sink(type='log') define stream EnrichedCreditCardStream (creditCardNo string,creditCardType string); @sink(type='http-request',publisher.url='http://www.mocky.io/v2/5cee2fa1300000013a6e9961',method='POST', headers="'Content-Type:application/x-www-form-urlencoded'", sink.id="cardTypeSink", @map(type='keyvalue', @payload(CardNumber='{{creditCardNo}}'))) define stream CreditCardStream (creditCardNo string); 库来扩展参数。