我使用(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
之前使用grep
,但是当搜索字符串跨越多个单词时,这不起作用。
答案 0 :(得分: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"
答案 1 :(得分:0)
使用`grep --colour = auto'代替可以解决问题。
答案 2 :(得分:0)
您可以使用hmt。正是针对这种情况而构思的。
注意:我是hmt
的作者。