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

acm*_*acm 38 colors ksh sed shell-script text-processing

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

linux 上的命令(输出“test”正确着色为红色):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test
Run Code Online (Sandbox Code Playgroud)

在solaris 上的命令(输出“test”没有颜色):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 44

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

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

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

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

您可以tput在调用 sed 时调用以生成替换文本。此命令在terminfo数据库中查找转义序列。理论上, usingtput使您的脚本更易于移植,但实际上您不太可能遇到不使用ANSI 转义码的终端。

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Run Code Online (Sandbox Code Playgroud)


bah*_*mat 9

使用起来会更方便 tput

tput setaf 1; somecommand; tput sgr0
Run Code Online (Sandbox Code Playgroud)

或者

tput setaf 1
somecommand
tput sgr0
Run Code Online (Sandbox Code Playgroud)

somecommand会将前景设置为红色,然后运行它将以红色显示输出,然后清除颜色序列。这至少适用于bash,zshksh

请参阅tmux(1)terminfo(5)了解有关您可以使用 做什么的更多信息tput


小智 6

还有一种更简单的方法:

要确切知道哪个字节对应于转义字符\033,您可以执行以下操作:

printf "\033" | xxd -p
Run Code Online (Sandbox Code Playgroud)

你得到

1b

因此转义序列 \033 对应于二进制的字节 0b00011011、十进制的 27 或十六进制的 1b。

好消息:sed 知道十六进制代码!

echo "color test" | sed 's,color,\x1b[31m&\x1b[0m,'
Run Code Online (Sandbox Code Playgroud)

当你知道你的十六进制时,这是一个更好的解决方案。