2013-02-06 5 views
6

パイプ出力をグロッピングするときに、grepをANSIカラーエスケープにするにはどうすればよいですか? grepの代わりに何か他のもの(perl?)を使ってうれしいです。grepで色付きテキスト、例: gcc | colorgcc | grep regexp

マイusercase:私は、(ANSIエスケープを使用して、UNIX端末上)の色とうまく

gcc foobar.c | colorgcc | grep regexp 
ls --color | grep filename 

仕事をしたいです。

私が望む行動のテスト例は:

echo -e "he\e[35mllo\e[00m" world |grep hell ==> he\e[35mllo\e[00m world 
echo -e "\e[35m removed line\nhello\e[00m" world |grep hell ==> \e[35mhello\e[00m world 
echo -e "\e[35m rem\e[1moved line\nhello\e[00m" world | grep hell ==> \e35m\e1mhello\e[00m world 

現在、最初の行は、空の文字列を与え、そしてもう一つはuncolorised文字列 「こんにちは\ E [00メートルの世界」を提供します。ここで、\ e [35mと\ e00mは色(属性)修飾子です。文字の色は、最後の色(属性)エスケープシーケンス\ e [P1; P2; .. mここで、P1、P2などは数字のシーケンスです。 \ e [P1m \ e [P2mは\ e [P1; P2mと等価です。 \ e [0mは色をデフォルトにし、前のすべての\ e [.. m個のシーケンスを忘れる。\ e [34m \ e [0mは\ e [0m。独立した属性がいくつかあります(太字、背景の色、前景/文字の色)。エスケープシーケンスの各数字は、そのうちの1つだけに影響します。したがって、\ e [1m \ e [35mは\ e [1; 35mではなく、\ e [35; 1mも\ e [35m;しかし、\ e [34m \ e [35mは両方とも同じattirbute(すなわち、文字/前景の色)に影響を与えるので、\ e [35mと等価です。

+2

ソリューションで最初に刺し:ここ

はegrepのバージョンですcolorgcc | less -R +/regexp'を指定します。 'less -R'はカラーコードを理解し、その周辺を検索します。 – nneonneo

答えて

2

これは本当に興味深い問題です、ここで私が思いついたのです。それはかなり醜いですが、仕事を得るようだ:

sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' | 
    grep `sed 's/./\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\)*/g' <<< hell` 

あなたが(「地獄」の代わりに)一番最後に配置されることになる探している用語は、ここでは、テキストといくつかの例であり、あなたは(色を表示するために、hexdumpに対してを使用して)提供:

$ echo -e "he\e[35mllo\e[00m" world | 
> sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' | 
> grep `sed 's/./\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\)*/g' <<< hell` | 
> hexdump -C 
00000000 1b 5b 30 6d 68 65 1b 5b 33 35 6d 6c 6c 6f 1b 5b |.[0mhe.[35mllo.[| 
00000010 30 30 6d 20 77 6f 72 6c 64 0a     |00m world.| 
0000001a 

$ echo -e "\e[35m removed line\nhello\e[00m" world | 
> sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' | 
> grep `sed 's/./\0\\\\(\x1b\\\\[[0-9]*m\\\\(;[0-9]*m\\\\)*\\\\)*/g' <<< hell` | 
> hexdump -C 
00000000 1b 5b 33 35 6d 68 65 6c 6c 6f 1b 5b 30 30 6d 20 |.[35mhello.[00m | 
00000010 77 6f 72 6c 64 0a         |world.| 
00000016 

最初のsedコマンドでは色がgrepの行に設定されている2番目の例では必要である各行の先頭に現在の色設定を付加しますスキップします。 grepの引数であるsedコマンドは、検索タームの各文字の間に任意の数のカラーエスケープに一致する正規表現を挿入します。 | `gccのfoobar.c:

sed -n '1s/^/\x1b[0m/;H;x;s/\n//;p;s/.*\(\x1b\[[0-9]*m\(;[0-9]*m\)*\).*/\1/;h' | 
    egrep `sed 's/./\0(\x1b\\\\[[0-9]*m(;[0-9]*m)*)*/g' <<< hell` 
+0

ありがとう!これは正しく動作しません:echo -e "\ e [35m削除\ e [0m行\ nh \ e [34mel \ e [32mlo \ e [00m" –

+0

ああ、ごめんなさい!いいえ、うまくいきます。それは任意の正規表現で動作しますか?最後の 'grep'を 'egrep'に置き換えても動作しないようです –

+0

grepをegrepに置き換えると、 '('または ')'の直前にある2番目のsedコマンドのバックスラッシュをすべて削除できます。 。これを編集に追加しました。 –