次の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で動作するようですが、混乱しています。
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$
これらのエスケープシーケンスが問題を引き起こしている可能性があります。