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)
使用起来会更方便 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
,zsh
和ksh
。
请参阅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)
当你知道你的十六进制时,这是一个更好的解决方案。