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

上記の行は、ここで間違っているものを私にエラーUnmatched (or \(システムのgrepは

を与えているアンバランス括弧になりますか?

(より前にバックスラッシュを試しました。同じエラーが表示されます。あなたはスクリプトであるため、3つのバックスラッシュ

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

「$ a」とは何ですか?これはスクリプトの初期に作成されたファイル名ですか? – zdim

+0

['誰かが私の質問に答えるとき、どうすればいいですか '](http://stackoverflow.com/help/someone-answers) – zdim

答えて

0

、なぜ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リストコンテキストを課しので、それは読み込み、一度に開いた後、あなたが、同様に1行で処理できる大きすぎない場合

リスト内のすべての行が返され、条件に合格した行が出力されます。


regexに対するコメント。現状では、Typeまたはgroupまたはslack (と一致します。万一、いずれかの単語と一致する場合はスペース - 括弧が続く場合は、グループ化括弧/(?:Type|group|slack) \(/が必要です。 ?:があるので、不必要にキャプチャされません。

+0

なぜ3つの具体的に? – melpomene

6

を使用する必要が

0

(は、grep -Eの正規表現メタ文字です。だからこそあなたは誤りを得る。

単一のバックスラッシュを追加しても、perl:"\("で処理された文字は"("と同じ文字列なので修正できません。 (は、基本的な「POSIXでは特別なものではありませんので、

はそれを修正するには、(その後、grepによって解釈され、2つの文字列\(、変身"\\("、)2つのバックスラッシュを使用するか、または-Eオプションを削除するか必要があります"正規表現(これはデフォルトでgrepが使用するものです)。