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


29

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

Linuxのコマンド(出力「テスト」は正しく赤で表示されます):

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

solarisのコマンド(出力「テスト」は色付けされていません):

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

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

回答:


35

\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),"

これはcat |sedあまりにもthxで色付けするのに最適です!
アクエリアスパワー

8

使いやすいでしょう tput

tput setaf 1; somecommand; tput sgr0

または

tput setaf 1
somecommand
tput sgr0

これは前景を赤に設定し、実行somecommandすると赤で出力が表示され、色シーケンスがクリアされます。これは少なくともとbashで機能zshkshます。

参照してくださいtmux(1)terminfo(5)あなたが何ができるかの詳細についてはtput


応答していただきありがとうございます。前に言ったように、echoコマンドを変更することはできません。「エコー」は、私が呼んでいるプロセスの代役に過ぎず、変更することはできません。どういうわけかtputでsedを使用できますか?また、sunOS 5.10でそのコマンドを実行すると、色が表示されません。
acm

個別のコマンドに分解するように更新しました。
バハマ

これは、現在の実装よりも優れており、solarisに生のASCIIコードを出力しません。ただし(何らかの理由で)、solarisの「somecommand」の出力は色付けされません。Linuxで実行します。私は、@ Gillesの回答を受け入れました。ありがとうございました。
acm

0

一部の端末(itermのbashなど)では、「ctrl-v」キーに続いて「ctrl + [」キーを押すと、入力文字列にリテラルエスケープ文字が挿入されます。機能する場合は、おそらく画面に「^ [」という文字が印刷されていますが、カーソルを移動すると、実際には舞台裏にあるため、1文字として扱われます。

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

そのレガシーな理由から、多くの端末のbashは特定のctrlコードを解釈してそれらの同じ文字にマップします。

Ctrl + Iはタブ文字にマップし、ctrl + [は偶然asciiエスケープ文字に一致します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.