考虑非打印字符的文本换行

考虑非打印字符的文本换行

这个问题询问是否在某一列换行文本,人们建议使用foldorfmt但据我所知,这些只是计算字符并且不允许非打印字符。例如:

fold -w 20 -s <<<`seq 1 25`

正如人们所期望的那样,产生:

1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 
16 17 18 19 20 21 
22 23 24 25

但:

fold -w 20 -s <<<^[[32m`seq 1 25`^[[m

^[转义字符在哪里)直观上应该在绿色文本中产生相同的内容,但会产生:

1 2 3 4 5 6 7 
8 9 10 11 12 13 14 
15 16 17 18 19 20 
21 22 23 24 25

以绿色文本显示。

我看不到任何说明要考虑非打印字符的开关,并且标记非打印字符的 PS1 方法似乎不适用于foldor fmt

是否有某种东西(最好是标准的东西)可以在考虑不可打印字符的同时换行文本?


编辑:

上面的例子实际上是为了简化和演示问题,但我可能过于简化了。为了澄清我的实际示例,我有一些文本,其中一些单词是彩色的(使用 ANSI 转义序列),我希望它能够整齐地换行。例如:

Here is some example text that contains ^[[31mred^[[m and ^[[32mgreen^[[m words that I would like to wrap neatly.

^[转义字符在哪里。

如果我希望将其换行为 20 列,我会期望:

Here is some
example text that
contains red and
green words that
I would like to
wrap neatly.

(颜色为“红色”和“绿色”)但由于 ANSI 转义码,它会这样换行:

Here is some
example text
that contains
red and
green words
that I would like
to wrap neatly.

答案1

ANSI 转义序列由 shell 解释,而不是由管道解释。因此,您实际上是将文本^[[32m与序列输出一起插入到折叠命令中。如果你想让整个文本变成绿色,你可以尝试这样的事情:

echo -e "\e[32m"$(seq 1 25 | fold -w 20 -s)"\e[m"

或者

echo -e "\e[32m"; seq -s ' '  1 25 | fold -w 20 -s; echo -e "\e[m"

请注意,我使用\e作为转义字符。这可以直接在 bash shell 中进行测试。

相关内容