如何grep perl数组中的某些模式并使用sed命令并将输出保存为另一个数组,如下面一个
my @modifiedfiles=`echo @files | grep -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;'`
答案 0 :(得分:8)
你没有 - 这没有意义:)
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
不同。有关详细信息,请参阅文档:
如果你真的想要这样做,可以通过以下方式实现:
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
过滤掉文件,脚本甚至会开始阻止。
答案 1 :(得分:3)
请不要,只需使用buildin Perl函数:
@modifiedfiles = map({
s/.*something//g;
s/#.*$//g;
} grep({
/DataFiles|Pfgas|Startups/
} @files));