![使用 sed 对尾部输出进行着色](https://linux22.com/image/27381/%E4%BD%BF%E7%94%A8%20sed%20%E5%AF%B9%E5%B0%BE%E9%83%A8%E8%BE%93%E5%87%BA%E8%BF%9B%E8%A1%8C%E7%9D%80%E8%89%B2.png)
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
第一个记住的模式。