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

Colors 如何从fmt中隐藏ANSI颜色转义码,colors,ansi-escape,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 midd

我使用(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

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

使用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" echo搜索字符串将以红色突出显示fmt-w 50 | sed“:a;$!N;$!ba;s/search[\N]string/\x1b\[1;31m&\x1b\[0m/g”使用'grep--color=auto'可以解决问题。

您可以使用它。它正是为这种情况而设计的


注意:我是
hmt

的作者,谢谢。这就是我最终使用的解决方案。我实际使用它时使用的是
sed
,而不是
grep
。基本上,我转换标签(例如
中的
,这是一个|示例|字符串
)使用ANSI颜色序列为它们所跨越的单词上色。在替换之前使用
fmt
不是最佳选择,因为标记确实会占用一些空间,这会影响单词的包装,但这并不太糟糕,除非一行包含很多这样的标记,而且比在替换之后运行
fmt
要好(由于ANSI转义序列占用更多字符)。不,不会。在本例中,使用
grep--color=auto
与使用
grep--color=No
的结果相同。