
私が開発しているプログラムには、出力でカラーコードを有効/無効にするオプションがあります。
この機能が期待どおりに機能するかどうかをテストしたいと思います。私が試したことは次のとおりです。
$ myprogram | grep -q '\e[32m' # testing for green color
$ myprogram | grep -q '\e'
$ myprogram | grep -q '\033'
また、二重バックスラッシュを使用し、引用符なしで同じコマンドを試しました。
しかし、これらのどれも機能しません。
プログラムの出力にカラーコードが含まれているかどうかをテストするにはどうすればよいですか?
答え1
このgrep
コマンドと対応する BRE および ERE バリアントは、ESC を表すシーケンスを認識しません。 Perl拡張(GNU)を使用するgrep -P
か、固定シェル文字列と一致する必要があります。
# string with shell formatting, grep uses fixed string match
( tput setaf 2; echo Green text; tput op ) | grep -Fq $'\033[32' && echo found green
found green
# grep uses Perl's PCRE match to match any colour (change "\d+" to "32" for just green)
( tput setaf 2; echo Green text; tput op ) | grep -Pq '\033\[\d+[;m]' && echo found a colour
found a colour
シェルが$'...string here...'
文字列形式をサポートし、特定の色のみを一致させたい場合は、このオプションを選択することをお勧めします。
答え2
あなたができるもう一つのことは、 'tr'を使ってエスケープ文字を別のものに変換することです。特に^または%、または^ A(control-A)などの文字がある場合はgrepする満足そうです:
boldfoo=$(printf "not bold \033[1mfoo\033[m not bold")
echo $boldfoo
echo $boldfoo | tr '\033' '\001' | grep ^V^A # Type <Ctrl-V><Ctrl-A>
# Use the return value from this to see whether there are escape characters in $boldfoo.
私はこのトリックを使ってsed / grepを使って複数行のパターンを見つけました。 ^Aになってからパターンを^Aなどと一致させます。今、入力全体が1行なので、少しトリックが必要ですが、少し努力が必要です。