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

Kar*_*mer 5 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."
Run Code Online (Sandbox Code Playgroud)

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

echo $string | grep --color=no i | fmt -w 50
Run Code Online (Sandbox Code Playgroud)

但是如果我们突出显示/着色它们,则fmt认为包含字母"i"的线条比它们实际上要长得多,并且当它们显示在终端中时它们显示为相当短的线条.

echo $string | grep --color=yes i | fmt -w 50
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*yle 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"