使用 sed 对尾部输出进行着色

Dem*_*cht 4 shell sed quoting

我将如何对tailwith的输出进行着色sed

echo "`tput setaf 1`foo`tput op`" 按预期工作

echo "foo" | sed -e 's/(foo)/`tput setaf 1`\0`tput op`/g' 然而,没有。

我在这里缺少什么?

小智 6

echo 命令中的反引号 `` 产生一个进程,它的输出被替换到 echo 命令行中。你可以看到这个,例如

echo "`tput setaf 1`" | hexdump -C
00000000  1b 5b 33 31 6d 0a                       |.[31m.|
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为 的内容"..."在传递给 echo 之前被扩展。

您正在使用的 sed 命令将所有内容都包装起来,'因此它被传递给 sed 而不进行扩展,并且 sed 将其全部视为文字文本。

您可以通过将 "" 放在 sed 命令周围来解决此问题

echo "foo" | sed -e "s/\(foo\)/`tput setaf 1`\1`tput op`/g"
Run Code Online (Sandbox Code Playgroud)

您的 sed 命令也有错误。的()需要进行转义\(,并\)表示该记住的模式。我也从来没有用过\0我一直用\1作为第一个记住的模式。


小智 5

必须是sed吗?

echo "foo bar baz" | grep --color=auto "bar"
Run Code Online (Sandbox Code Playgroud)

bar默认情况下,上面将以红色突出显示。手册页说您可以选择与环境变量一起使用的颜色GREP_COLORS

要使其打印所有行并仅突出显示bar

echo "foo bar baz" | grep -E --color=auto "^|bar"
Run Code Online (Sandbox Code Playgroud)