这个问题询问是否在某一列换行文本,人们建议使用fold
orfmt
但据我所知,这些只是计算字符并且不允许非打印字符。例如:
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 方法似乎不适用于fold
or 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 中进行测试。