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つのスペースをタブ文字に置き換えることを見ましたが、スペース以外の文字が表示されるたびに余分なスペースが追加されます。

bash-4.3.42-3.fc23.x86_64とcoreutils-8.24-6.fc23.x86_64の使用

この動作を説明してもよろしいですか?

ベストアンサー1

このunexpandプログラムは、単に8つのスペースをタブ文字に置き換えるものではありません。タブ文字のために行を表示するために使用される端末が次の行に移動すると仮定して、行のスペースとタブを置き換えます。タップ停止。通常、これらの間隔は8マスですが、ほとんどの端末では間隔が変更される可能性があります(間隔は各駅で変更される可能性があります)。

最初の文字列例は、"A12345678B"数字 1~8 を空白に置き換えます。結果の最初の8文字はタブ区切りです。これにより、最初のタブ(8の位置)にスペースが残ります。このunexpandプログラムはそうではありません次へ追加space; unexpand1-7のスペースをタブに変えた後に残ったもの。

タブを使用すると、unexpandほとんどのスペース(またはスペースとタブの混合)を含むファイルを一貫した形式に変換できます。同じ理由で、スペースで始まる行が多いファイルは、タブを使用するファイルよりはるかに大きくなる可能性があります(インデント)。また、ファイルを変換して使用するために使用されます。その他たとえば、タブストップはタブストップセットに合わせて、列が並べられたテーブルをより広くまたは狭くします。

異なるタブ間隔間の変換は、次のように実行できます。

expand -t 1,6,11,16,21 foo | unexpand -t 1,9,17,25,33 >bar

タップ停止設定に加えて端末、一部のプログラム(例vi:)は、タブ間隔が異なるテキストを表示することがあります。

追加読書

おすすめ記事