3

パイプと一緒にgrepを使用すると問題が発生します。シナリオは次のとおりです。画面デバッグ メッセージに (印刷を使用して) 出力する Python スクリプトを実行しています。./prog | grep "\[\[\[\["「[[[[」を含む文字列をキャッチするために使用します。一致する結果はほとんど返されませんが、他の結果は返されません (別の観察: grep によって見つかった結果は、ファイル内で grep によって見つからなかった結果の前に来ます)。./progパイプとgrepなしで実行したところ、すべての文字列が「[[[[」パターンで出力されました。

4

2 に答える 2

3

問題は、左角括弧が正規表現の特殊文字であることです。「grep」は単なる文字列マッチャーではありません。正規表現は、テキストのパターンを記述できる複雑な言語です。[[[[grep は単なる文字列ではなく、正規表現として解釈しようとしています。

質問の件名が示唆するように、通常は特殊文字をバックスラッシュでエスケープできます。したがって、次のように動作する可能性があります。

./prog | grep '\[\[\[\['

角かっこの中に入れて、角かっこを「エスケープ」することもできます。したがって、[[][[][[][[]または[[]{4}grepのバージョンがそれを処理する場合。

./progまた、プログラムが出力を「標準出力」または「標準エラー」に送信しているかどうかを判別する必要もあります。次のコマンドを使用して、すべての stderr をパイプに通すことができます。

./proc 2>&1 | egrep '[[]{4}'

アップデート:

[ghoti@pc ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | grep '\[\[\[\['
[[[[
[[[[
[[[[[
[ghoti@pc ~]$ printf '[[[[\n[[[\n[[[[\n[[[[[\n[[\n' | egrep '[[]{4}'
[[[[
[[[[
[[[[[
[ghoti@pc ~]$  

明らかに、私の結果はあなたの結果と一致しません。処理しているデータに関する詳細を提供できる場合は、結果を複製する際に役立ちます。

于 2012-04-25T21:11:53.407 に答える
2

エラー メッセージは通常stderr、 ではなくに送信されstdoutます。あなたのパイプはフィルタリングしていますstdout。(あなたの「別の観察」はこれを示唆しています。)パイプstderrに一緒にリダイレクトできます:stdout

./prog 2>&1 | grep '\[\[\[\['
于 2012-04-25T21:10:06.863 に答える