2016-05-24 96 views
3

如何在一個perl陣列用grep某些圖案和用sed命令和輸出保存爲另一個陣列,如下面一個使用UNIX命令,如grep和sed用於Perl陣列

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

回答

7

你不 - 它是沒有意義:)

Perl有grepmap內置:

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; 

但是皮爾斯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; 
} 

不,你不」不想這樣:)它有很多缺點和高失敗的風險。如果grep過濾掉了一個文件,我認爲腳本甚至會開始阻止。

+2

這是一個很好的答案,一步一步的記憶和。鏈接到文檔+1 :-) – andlrc

+0

謝謝! @Sebastian :) – no1

+2

可能值得一提的是就地功能'/.* // //用於@ filteredfiles' – Sobrique

3

別牛逼,只是使用的buildin Perl函數:

@modifiedfiles = map({ 
    s/.*something//g; 
    s/#.*$//g; 
} grep({ 
    /DataFiles|Pfgas|Startups/ 
} @files)); 
+0

無與倫比)在正則表達式;標記爲,我得到這個錯誤! – no1

+0

@ no1我犯了一個C/P錯誤,但它已經修復了,再試一次。 – andlrc