Unexpandについての説明をすでに読んだことがありますが、理解できないか、期待どおりに機能していません。
次の例を考えてみましょう。
[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a
A B
[root@hope log]# echo "A12345678B" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000 A ht sp B nl
0000005
[root@hope log]# echo "A12345678B12345678C" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000 A ht sp B ht sp sp C nl
0000011
[root@hope log]# echo "12345678" | tr '[1-8]' ' ' | unexpand -a | od -ta
0000000 ht nl
0000002
8つの空白が1つのタブに置き換わっていますが、空白以外の文字が表示されるたびにスペースが1つ追加されます。
Bash-4.3.42-3.fc23.x86_64およびcoreutils-8.24-6.fc23.x86_64の使用
この振る舞いについて説明していただけますか?
unexpand
プログラムは、単に8つのスペースをタブに置き換えるだけではありません。これは、行のスペースとタブを、タブによって行の表示に使用される端末が次のtabstopに移動することを前提に置き換えます。通常、これらは8スペースの間隔ですが、ほとんどの端末では間隔を変更できます(各停止の間隔も変更できます)。
最初の例の文字列"A12345678B"
1〜8の数字をスペースに置き換えます。結果の最初の8文字は、1つのタブ間隔です。これにより、最初のタブストップにスペース(8があった場所)が残ります。 unexpand
プログラムはスペースを追加しません。これは、unexpand
が1〜7のスペースをタブに置き換えた後に残ります。
unexpand
を使用して、ほとんどがスペース(またはスペースとタブの混合)を含むファイルを、タブを使用して一貫した形式に変換します。同じ理由で、スペースで始まる行が多いファイルは、タブを使用したファイルよりもはるかに大きくなる可能性があります(インデント)。また、differentタブストップを使用するようにファイルを変換するために使用されます。たとえば、列が1セットのタブストップと整列しているテーブルの場合、広いまたは狭い。
異なるタブ間隔間の変換は、次のように実行されます。
expand -t 1,6,11,16,21 foo | unexpand -t 1,9,17,25,33 >bar
ターミナルで設定されたタブストップに加えて、一部のプログラム(vi
など)は異なるタブ間隔でテキストを表示できます。
参考文献