拡張で異なる数の空白文字を使用するのはなぜですか?

拡張で異なる数の空白文字を使用するのはなぜですか?

拡張コマンドが各タブ文字を正確に8つの空白文字に変換しないのはなぜですか?

たとえば、this^Iis^Itabs ^Iタブ文字を表す)

になる:this____is______tabs____ (空白を表示するには下線を追加してください)

変える:this________is________tabs________

私のテストでは、Expandは単語の境界からタブ文字の前にあるすべての文字を取得し、タブ文字を目的のスペース数に変換して合計8文字(該当する単語の境界内の文字を含む)を追加するようです。

なぜそんなことですか?

マニュアルページでは、この動作に関するヒントは提供していません。

答え1

このexpandユーティリティは、文字をtab次の暗黙的なタブストップに拡張します。歴史的に、これらの文字はデフォルトで8文字ごとですが、optionsを使用して変更できます-t

printf "%s\t%s\t%s\n" 12345 1234 123
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand
12345   1234    123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10
12345     1234      123

printf "%s\t%s\t%s\n" 12345 1234 123 | expand -t 10,16
12345     1234  123

実際に8つのスペースに置き換えるには、次のものをtab使用できますsed

printf "%s\t%s\t%s\n" 12345 1234 123 | sed 's/\t/        /g'

答え2

これが正しいアイデアタブの場合は、次の列に移動し、位置は前のフィールドの幅によって変わりません。たとえば、2番目の列を適切にソートするタブは次のとおりです。

$ echo $'123\tfoobar\n123456\tblahblah'
123     foobar
123456  blahblah

2行に同じ数のスペースがあると、結果が見えなくなります。

123        foobar
123456        blahblah

8文字のタブストップの場合、これはもちろん値が0〜7(または8〜15など)文字の場合にのみ機能し、8文字の制限を超えるバリエーションは再び醜い結果をもたらします。

$ echo $'123\tfoobar\n123.345e6\tblahblah'
123     foobar
123.345e6       blahblah

そのためには、タブストップを別の値に設定する必要があります。

$ echo $'123\tfoobar\n123.345e6\tblahblah' | expand -t 12
123         foobar
123.345e6   blahblah

タブを使用するのではなく、同様の出力を実行する別の方法は、printf固定幅フィールドを使用することです(デフォルトでは出力と似ていますexpand)。

$ printf "%-11 %s\n" 123 foobar 123.345e6 blahblah
123          foobar
123.345e6    blahblah

答え3

これマニュアルページexpand するデフォルトのタブ間隔が8文字であることを示します。

-ティー--タブ=数字

タブで8文字ではなくNUMBER文字を切り捨てる

これ情報ページ(GNUプロジェクトはマニュアルページを好む)同様に言及

基本操作は-t 8(8列ごとのタブ設定)と同じです。

しかし、より具体的に言えば、タブは各x列端末から挿入する代わりにx 空白文字。説明で述べたように、タブは、特定のオフセットでタイプライターに接続された物理クリップであり、列の書式設定のために特定の列に移動できるようになりました。

関連情報