拡張コマンドが各タブ文字を正確に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 空白文字。説明で述べたように、タブは、特定のオフセットでタイプライターに接続された物理クリップであり、列の書式設定のために特定の列に移動できるようになりました。