我使用 (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
,但是当搜索字符串跨越多个单词时,这不起作用。
最佳答案
似乎没有一个好的方法可以使用 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"
关于colors - 如何从 fmt 中隐藏 ANSI 颜色转义代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1116938/