使用sed为solaris上的命令的输出着色


29

我有一个必须在linux和solaris上都可以使用的ksh脚本。我正在尝试为特定命令的输出着色。它可以在Linux(特别是RHEL6)上运行,但不能在solaris(SunOS 5.10)上运行。

在Linux上的命令(输出“测试”正确地显示为红色):

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

关于so​​laris的命令(输出“ test”未着色):

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

有没有办法制作此命令,使输出为红色,而输出中没有原始代码?我不能更改'echo'命令,因为这只是我实际运行的命令的填充。

Answers:


35

\xNN 是GNU sed中的转义序列,但不是标准的,特别是在Solaris上不可用。

您可以在脚本中包含文字转义符,但这将使其难以阅读和编辑。

您可以printf用来生成转义字符。它了解八进制转义,而不是十六进制。

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非常有用!
Aquarius Power

8

使用起来会更容易 tput

tput setaf 1; somecommand; tput sgr0

要么

tput setaf 1
somecommand
tput sgr0

somecommand会将前景设置为红色,然后运行,然后将其显示为红色,然后清除颜色序列。这个工程至少有bashzshksh

请参阅tmux(1)terminfo(5)以获取有关可以使用的功能的更多信息tput


感谢您的回应。如前所述,我无法更改echo命令。“ echo”只是我正在调用的过程的替代者,不能更改。可以以某种方式将sed与tput一起使用吗?另外,当我在sunOS 5.10上运行该命令时,我看不到任何颜色。
2012年

我对其进行了更新,以将其分解为单独的命令。
bahamat 2012年

这比我当前的实现要好,因为它不会在solaris上打印原始的ASCII代码。但是(无论出于何种原因),它不会使solaris的“ somecommand”输出着色。它在Linux上执行。我已经接受@Gilles的答案,两者都可以。谢谢。
2012年

0

某些终端程序(如iterm中的bash对我而言)允许您按下“ ctrl-v”键,然后按下“ ctrl + [”键,这会将原义转义符放入输入字符串中。如果可行,您可能会在屏幕上看到字符“ ^ [”,但如果将光标移到该字符上,它将被视为一个字符,因为它实际上是在幕后。

要了解正在发生的事情(并测试是否可行),可以键入ctrl + v,然后键入ctrl + i。您应该看到选项卡字符已插入到提示字符串中。出现这种情况的原因有CS的历史:但是事实证明,确实很旧的键盘具有ctrl + I硬连线,无法发送制表符。和Tab键也发送相同的电子信号。

由于该传统原因,许多终端的bash仍会解释某些ctrl代码以映射到那些相同的字符。

Ctrl + I映射到制表符,而ctrl + [恰好与ascii转义符匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.