web-dev-qa-db-ja.com

unexpandコマンドは実際にどのように機能しますか?

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の使用

この振る舞いについて説明していただけますか?

3
sebelk

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など)は異なるタブ間隔でテキストを表示できます。

参考文献

7
Thomas Dickey