web-dev-qa-db-ja.com

sedを使用して、solarisのコマンドからの出力に色を付ける

LinuxとSolarisの両方で動作する必要があるkshスクリプトがあります。特定のコマンドの出力に色を付けようとしています。 Linux(特にRHEL6)では機能しますが、solaris(SunOS 5.10)では機能しません。

Linuxでのコマンド(出力「test」は正しく赤く色付けされています):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Solarisのコマンド(出力「test」は色付けされていません):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

このコマンドを作成して、出力に生のコードがない、出力が赤になるようにする方法はありますか? 「echo」コマンドを変更することはできません。これは、実際に実行しているコマンドの入力にすぎないためです。

31
acm

\xNNはGNU sedのエスケープシーケンスですが、標準ではありません。特にSolarisでは使用できません。

スクリプトにリテラルエスケープ文字を含めることができますが、その場合、読み取りや編集が難しくなります。

printfを使用してエスケープ文字を生成できます。 16進数ではなく8進数のエスケープを理解します。

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

tput を呼び出して、sedの呼び出しで置換テキストを生成できます。このコマンドは terminfo データベースでエスケープシーケンスを検索します。理論的には、tputを使用するとスクリプトの移植性が向上しますが、実際には ANSIエスケープコード を使用しない端末に遭遇することはほとんどありません。

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"

tputを使用する方が簡単でしょう

_tput setaf 1; somecommand; tput sgr0
_

または

_tput setaf 1
somecommand
tput sgr0
_

これにより、フォアグラウンドが赤に設定され、somecommandが実行されます。これにより、出力が赤で表示され、カラーシーケンスがクリアされます。これは少なくともbashzshおよびkshで機能します。

tputでできることの詳細については、tmux(1)およびterminfo(5)を参照してください。

8
bahamat

一部の端末(私用のitermのbashなど)では、キー「ctrl-v」に続けて「ctrl + [」を押すと、リテラルエスケープ文字が入力文字列に挿入されます。動作する場合は、画面に「^ [」という文字が表示されますが、カーソルをその周りに移動すると、実際には背後にあるため、1つの文字として扱われます。

何が起こっているのかを理解する(そして、これが可能かどうかをテストする)には、ctrl + vに続けてctrl + iを入力します。プロンプト文字列にタブ文字が挿入されているはずです。これが当てはまる理由については、CSの履歴があります。しかし、本当に古いキーボードには、タブ文字を送信するためのctrl + Iハード有線が困難であることがわかりました。タブキーも同じ電気信号を送信します。

その従来の理由により、多くの端末のbashは、特定のctrlコードを解釈して同じ文字にマップします。

Ctrl + Iはタブ文字にマップされ、ctrl + [はたまたまASCIIエスケープ文字に一致します。

0
Alexander Bird