对perl数组使用grep和sed等unix命令

no1*_*no1 3 unix perl grep sed

我如何grep perl数组中的某些模式并使用sed命令并将输出保存为另一个数组,如下所示

my @modifiedfiles=`echo @files | grep  -E '(DataFiles|Pfgas|Startups)' | sed -e 's/.*something//g; s/#.*$//g;'` 
Run Code Online (Sandbox Code Playgroud)

Seb*_*ian 8

你没有 - 这没有意义:)

Perl有grepmap内置:

my @filteredfiles = grep { /(DataFiles|Pfgas|Startups)/ } @files;
my @modifiedfiles = map { s/.*something//g; s/#.*$//g; $_ } @filteredfiles;
Run Code Online (Sandbox Code Playgroud)

也可以一步到位:

my @modifiedfiles =
    map { s/.*something//g; s/#.*$//g; $_ }
    grep { /(DataFiles|Pfgas|Startups)/ } @files;
Run Code Online (Sandbox Code Playgroud)

但皮尔斯grepmap命令行不同的表现grepmap.有关详细信息,请参阅文档

无论如何你真的想要这样做,它有可能是这样的:

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;
}
Run Code Online (Sandbox Code Playgroud)

不,你不想这样:)它有很多缺点和失败的高风险.我假设如果grep过滤掉文件,脚本甚至会开始阻止.

  • 这是一个很好的答案,一步一步的记录和.链接到文档+1 :-) (2认同)
  • 可能值得一提的是@softfiles`的inplace capability`s /.*/g (2认同)