我使用(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
,但是当搜索字符串跨越多个单词时,这种方法就不起作用了。
sed
而不是grep
。基本上,我将标签(如this is an |example| string
中的|
)转换为 ANSI 颜色序列以着色它们跨越的单词。在替换之前使用fmt
并不是最佳选择,因为标签会占用一些空间,影响了自动换行,但除非一行包含很多这样的标签,否则情况并不太糟糕,而且比替换后运行fmt
好(因为 ANSI 转义序列占用更多字符)。 - Karl Ove Hufthammer