2016-11-21 115 views
1
system ("grep -E 'Type|group|slack (' $a > temp.rpt"); 

上面一行是給我一個錯誤Unmatched (or \(系統的grep給出不平衡括號

這裏有什麼問題?

我也試過(之前的反斜槓。它顯示相同的錯誤。

+0

什麼是$ a?這是一個文件名,在腳本的早期構建? – zdim

+0

請參閱['當有人回答我的問題時該怎麼辦?](http://stackoverflow.com/help/someone-answers) – zdim

回答

0

您需要使用三個反斜槓

system ("grep -E 'Type|group|slack \\\(' $a "); 
+0

爲什麼選擇三個? – melpomene

6

既然你在一個腳本,爲什麼不這樣做在Perl?

my $infile = '...'; 
open my $fh,  '<', $infile or die "Can't open $file: $!"; 
open my $out_fh, '>', $temp.rpt or die "Can't open $temp.rpt: $!"; 

while (<$fh>) { 
    print $out_fh $_ if /Type|group|slack \(/; 
} 

根據需要調整您的正則表達式。一般來說,現在改變和調整東西要容易得多。

如果輸入文件不是太大,你可以在一行中處理爲好,一旦你打開的文件

print $out_fh grep { /Type|group|slack \(/ } <$fh>; 

grep強加列表上下文<> operator,所以它讀取並一次返回列表中的所有行,並打印通過該條件的行。


對正則表達式的評論。現在,它匹配Typegroupslack (。如果有的話,你打算匹配任何一個詞,然後是空格,你需要分組括號/(?:Type|group|slack) \(/?:在那裏,所以它不是不必要的捕獲。

0

(grep -E中的正則表達式元字符。這就是你得到錯誤的原因。

添加一個反斜槓並不能修復它,因爲這是由perl處理的:"\("是與"("相同的字符串。

要解決它,你需要或者使用兩個反斜槓("\\(",它變成兩個字符串\(,然後由grep解釋),或刪除-E選項,因爲(是不是在POSIX「基本特「正則表達式(這是grep默認使用的)。