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