我如何grep perl数组中的某些模式并使用sed命令并将输出保存为另一个数组,如下所示
my @modifiedfiles=`echo @files | grep -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;'`
解决方法
你没有 – 这没有意义:)
Perl有grep和map内置:
my @filteredfiles = grep { /(DataFiles|Pfgas|Startups)/ } @files; my @modifiedfiles = map { s/.*something//g; s/#.*$//g; $_ } @filteredfiles;
也可以一步到位:
my @modifiedfiles = map { s/.*something//g; s/#.*$//g; $_ } grep { /(DataFiles|Pfgas|Startups)/ } @files;
但Perls grep和map的行为与命令行grep和map的行为不同.有关详细信息,请参阅文档
> http://perldoc.perl.org/functions/grep.html
> http://perldoc.perl.org/functions/map.html
无论如何你真的想要这样做,它有可能是这样的:
use IPC::Open2; $pid = open2(\*CHLD_OUT,\*CHLD_IN,"grep -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;" ); for my $file (@files) { print CHLD_OUT $file."\n"; my $result_fn = <CHLD_IN>; chomp $result_fn; push @modifiedfiles,$result_fn; }
不,你不想这样:)它有很多缺点和失败的高风险.我假设如果grep过滤掉文件,脚本甚至会开始阻止.