5

我使用(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 before grep,但是当搜索字符串跨越多个单词时,这不起作用。

4

3 回答 3

5

似乎没有使用 grep 和 fmt 解决该问题的好方法。我建议您先运行 fmt,然后使用 sed 而不是 grep 进行搜索。例如:

echo 搜索字符串将以红色突出显示。| fmt -w 50 | sed ":a;$!N;$!ba;s/search[\n]string/\x1b\[1;31m&\x1b\[0m/g"
于 2009-07-13T00:43:06.233 回答
0

改用 `grep --colour=auto' 可以解决问题。

于 2013-02-16T17:04:45.207 回答
0

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

注:我是hmt.

于 2018-09-09T13:45:26.743 回答