2009-07-12 13 views
5

私は、(最適な)改行で長いテキストを書式設定するのに(GNU)fmtを使用します。ただし、テキストにANSIカラーエスケープシーケンス(表示されず、テキストを表示するときにのみ色付けされます)が含まれている場合、fmtはこれらを通常の文字とみなし、間違った行の長さを計算します。fmtからANSIカラーエスケープコードを隠す方法

ここではリテラルエスケープ文字がどれくらいうまく機能するかはよく分かりませんが、ここではgrepを使用してANSIシーケンスを生成する簡単な例を示します。フォーマットするために長い文字列から始めましょう。

echo $string | grep --color=no i | fmt -w 50 

をしかし、我々はハイライト場合は/それらを色付け、fmtは文字「i」がはるかに長いことを含む行を考慮:

string="Here’s an example of a rather long \ 
string with quite a few words in the middle \ 
that grep chooses to colour red." 

我々はgrep試合をハイライト表示されない場合は、すべてが正常に動作します実際にはそうではありません。ターミナルに表示されると、かなり短く表示されます。

echo $string | grep --color=yes i | fmt -w 50 

これを回避する方法はありますか?この例では、もちろん、fmtの前にgrepを使用することもできますが、検索文字列が複数の単語にまたがる場合、これは機能しません。

答えて

5

grepとfmtを使用して解決する方法がないようです。最初にfmtを実行し、grepの代わりにsedを使用して検索することをお勧めします。例:

echo The search string will be highlighted red. | fmt -w 50 | sed ":a;$!N;$!ba;s/search[ \n]string/\x1b\[1;31m&\x1b\[0m/g"
+0

ありがとうございました。それが私が使い終わった解決策です。 これを実際に使用するには、実際には 'grep'の代わりに' sed'が必要です。基本的に、タグ( 'this is an | example | string'の' | 'など)をANSIカラーシーケンスに変換して、それらの単語に色付けします。 'fmt'を使うと最適化されていないので、タグはスペースを取るので、単語の折り返しに影響しますが、行に非常に多くのタグが含まれていなければそれほど悪くはありません。置き換えます(ANSIエスケープシーケンスはさらに多くの文字を取ります)。 –

0

代わりに `grep --colour = auto 'を使用すると問題は解決します。

+0

いいえ、そうではありません。 'grep --colour = auto'を使うと、この例で' grep --colour = no'を使うのと同じ結果になります。 –

関連する問題