メモの日々


2006年08月18日(金) [長年日記]

[unix][shell] 文字の色を変えるスクリプト

特定の文字だけ色を変えるフィルタが欲しかった。そういうコマンドあったけと考えたけど思いつかなかったので次のようなスクリプトを書いた。

#!/bin/bash
if [ $# -lt 1 ]; then
    echo 'usage $0 <string>'
    exit 1
fi

sed -e "s/${1}/^[[31m${1}^[[0m/g"

2つある「^[」の部分はエスケープ文字で、viなら挿入モードで Ctrl+v の後にESCキーを押して入力する。

このコマンドを「akaku」として、

$ echo ogawa | akaku gaw

を実行すると「gaw」の部分だけが赤く表示された。わーい。

これで

$ tail -f nantoka.log | akaku error

とかすると「error」が赤く表示されて便利なんだけど、

$ tail -f nantoka.log | akaku error | akaku warning

のように2回使うと何も表示されない。なんで?

(追記)どさにっきにgrepが出力をバッファリングする話が書かれていた。上で akaku を2回使うと表示されなかったのも、sed が出力をバッファリングするからかもしれない。

色を変えるエスケープシーケンス

覚え書き。どこを参照するのが正しいのかよく分かってないけど、console_codesのmanのECMA-48 グラフィクスレンディション(Graphics Rendition)の設定という章に

ECMA-48 SGR シーケンス ESC [ <パラメータ> m は表示属性を設定する。

とあって

0 すべての属性をデフォルトにリセットする。

31 フォアグラウンドを赤にセット。

とあるから、

^[[31mSTRING^[[0m

とすればSTRINGだけ赤くなるのだ。

やること

  • デザイン変更
  • 保険
  • ツールのDVDを観る
  • 単4乾電池
  • スリッパ