web-dev-qa-db-ja.com

色をgrepしても何も返されないのはなぜですか?

次のfoo.txtファイルがあります。

This is the first line.
This is the middle line.
This is the last line.

そして、単語middleだけで中央の行をgrepし、周囲を返すようにしています(例として)。これにより、文全体を強調表示できます(これはコンテキストオプションで使用する場合に特に便利です)。

それはする色なしで動作します:

$ 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 .\+')。

これが期待どおりに機能しないのはなぜですか?どうすれば修正できますか?それはバグですか、それとも何らかの理由で2つの正規表現を同時に使用できませんか?


OSXでテスト済み:

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

Linuxで動作するようですが、混乱しています。

6
kenorb

Grepを色オプションとともに使用すると、端末に色をオンまたはオフにするように指示する追加のエスケープ文字シーケンスが生成されます。これらのシーケンスは、正しく解釈されず、予期しない結果を引き起こすリスクがあります。
grepの出力をキャプチャすることでこれらを表示できます

色なし

greps出力をoutput.txtに送信します

% grep -o --color=none '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt 
This is the middle line.$

色付き

--color=alwaysオプションで色を強制します。 greps出力をリダイレクトすると、可能であれば、強調表示した正確な理由で色がオフになり、エスケープ文字によって副作用が発生する可能性があります。

% grep -o --color=always '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt                                             
^[[01;31m^[[KThis is the middle line.^[[m^[[K$

これらのエスケープシーケンスが問題を引き起こしている可能性があります。

3
the_velour_fog