この問題特定の列でテキストを折り返すかどうかを尋ねる質問に人々はまたはfold
使用を提案しましたが、fmt
私が知っている限り、これは文字だけを計算して印刷できない文字を許可しません。たとえば、
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
またはで動作しないようです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エスケープシーケンスはパイプではなくシェルによって解釈されます。したがって、実際には、^[[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シェルで直接テストできます。