似乎<>
运算符无法处理文件名模式,例如file * .txt。有这种需求的解决方案吗?例如,以某种名称模式(perl -i.bak -pe s/p1/p2/g file*.txt
)替换文件中的模式。我使用的是Windows,cmd.exe也没有扩展文件名模式。
答案 0 :(得分:4)
在* nix中,shell负责扩展路径中的通配符。在MSWin中,它是在应用程序上完成的。
perl -i~ -we "@ARGV = glob shift; s/p1/p2/g, print while <>" file*.txt
答案 1 :(得分:4)
glob
运算符用于扩展文件名中的通配符;见perldoc -f glob。但是,内置的将空格视为分隔符,这意味着它不能正确处理文件名中的空格。将其替换为File::Glob中的:bsd_glob
。 File::Glob
是一个标准模块,随Perl一起安装。有关标准模块的列表,请参阅perldoc perlmodlib。
use File::Glob qw( :bsd_glob );
@ARGV = map { glob } @ARGV;
这就是你如何将它融入你的单行内容:
perl -i.bak -MFile::Glob=:bsd_glob -pe"BEGIN { @ARGV = map glob, @ARGV } s/p1/p2/g" *.txt
答案 2 :(得分:0)
根据@choroba的回答,我认为使用BEGING块来翻译野人也很有效。
perl -i.bak -pe"BEGIN{@ARGV=glob shift}s/p1/p2/g" file*.txt
或以下适用于多种输入模式:
perl -i.bak -pe"BEGIN{@ARGV=map glob,@ARGV}s/p1/p2/g" file*.txt