如何从fmt隐藏ANSI颜色转义码

时间:2009-07-12 21:16:21

标签: colors ansi-escape

我使用(GNU)fmt来设置具有良好(“最佳”)换行符的较长文本。但是,如果文本包含任何ANSI颜色转义序列(从不显示,并且仅用于在显示文本时为文本着色),fmt会将这些视为普通字符,并计算错误的行长度。

我不确定文字转义字符在这里有多好用,所以这是一个使用grep生成ANSI序列的简单示例。让我们从一个长字符串开始格式化。

string="Here’s an example of a rather long \
string with quite a few words in the middle \
that grep chooses to colour red."

如果我们不突出显示grep匹配,那么一切正常:

echo $string | grep --color=no i | fmt -w 50

但是如果我们突出显示/着色它们,fmt会认为包含字母“i”的行比实际长得多,并且在终端显示时它们会显示为相当短的行。

echo $string | grep --color=yes i | fmt -w 50

有没有办法避免这种情况?对于此示例,我当然可以在 fmt之前使用grep ,但是当搜索字符串跨越多个单词时,这不起作用。

3 个答案:

答案 0 :(得分:5)

似乎没有一种好方法可以使用grep和fmt来解决这个问题。我建议你先运行fmt,然后使用sed而不是grep进行搜索。例如:

echo The search string will be highlighted red. | fmt -w 50 | sed ":a;$!N;$!ba;s/search[ \n]string/\x1b\[1;31m&\x1b\[0m/g"

答案 1 :(得分:0)

使用`grep --colour = auto'代替可以解决问题。

答案 2 :(得分:0)

您可以使用hmt。正是针对这种情况而构思的。

注意:我是hmt的作者。