次のファイルがありますfoo.txt
。
This is the first line.
This is the middle line.
This is the last line.
私は単語だけで中間線を把握し、周囲のmiddle
コンテキスト(例えば)を返すことによって文全体を強調表示したいと思います(これはコンテキストオプションで使用するときに特に便利です)。
それする色なしで働く:
$ grep -o --color=none '.\+ middle .\+' foo.txt
This is the middle line.
しかし、同じコマンドいいえ使用色:
$ grep -o --color=auto '.\+ middle .\+' foo.txt
(empty line)
注:-o
それなしでは何の違いもありません。
行の前半部分だけをフィルタリングすると機能しますが、次のようになります。
$ grep -o --color=auto '.\+ middle' foo.txt
This is the middle
しかし後半にはそうではない('middle .\+'
)。
これが期待どおりに機能しない理由と回避策は何ですか?これはバグですか、それとも何らかの理由で両方の正規表現を同時に使用できませんか?
OS Xでテスト済み:
$ grep --version
grep (BSD grep) 2.5.1-FreeBSD
しかし、Linuxでは動作しているようで、混乱しています。
答え1
colorオプションでgrepを使用すると、端末に色をオンまたはオフにするように指示する追加のエスケープ文字シーケンスが生成され、これらのシーケンスは正しく解釈されず、予期しない結果が発生する危険があります。
grepの出力をキャプチャしてこれを確認できます。
色がない
grep 出力を次に送信します。output.txt
% grep -o --color=none '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt
This is the middle line.$
カラフル
オプションを使用して色を強制します--color=always
。 grep出力をリダイレクトすると、可能であれば強調表示された正確な理由で色が消え、エスケープ文字には副作用がある可能性があります。
% grep -o --color=always '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt
^[[01;31m^[[KThis is the middle line.^[[m^[[K$
これらのエスケープシーケンスは問題を引き起こす可能性があります。