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

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

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

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

echo "foo" | sed -e 's/(foo)/`tput setaf 1`\0`tput op`/g'然而,事实并非如此。

我在这里缺少什么?

答案1

一定是这样吗sed

echo "foo bar baz" | grep --color=auto "bar"

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

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

echo "foo bar baz" | grep -E --color=auto "^|bar"

答案2

echo 命令中的反引号 `` 会生成一个进程,并将其输出替换到 echo 命令行中。你可以用例如看到这一点

echo "`tput setaf 1`" | hexdump -C
00000000  1b 5b 33 31 6d 0a                       |.[31m.|

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

您使用的 sed 命令将所有内容包装起来,'因此它会在不扩展的情况下传递给 sed,并且 sed 将其全部视为文字文本。

您可以通过在 sed 命令周围添加“”来解决此问题

echo "foo" | sed -e "s/\(foo\)/`tput setaf 1`\1`tput op`/g"

您的 sed 命令也有错误。和(需要)转义\(\)表示记住的模式。我也从来没有使用过\0我一直使用的\1第一个记住的模式。

相关内容