wc -Lは、タブ文字の行の長さ8を報告します。バグまたは機能?


12

-Lはの便利な機能ですwc。最も長い行の長さを印刷します。何らかの理由で、シングルバイトのタブ文字を8の長さに
拡張します。タブを「拡張」しないように設定する方法はありますか?そして、この拡張の背後にある理由は何でしょうか?

echo -n $'\t' | wc -L

出力 8

wc(GNU coreutils)7.4
GNU bash、バージョン4.1.5


-nは質問に直交します。
ユーザー不明

回答:


11

これに関連するバグレポートはなく、ソースファイルに次の行があります。 wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

おそらく画面上にファイルを表示するために必要な幅のヒントを与えるために、このように動作することを意図的に選択しているようです。

迅速な代替案は

echo -n $'\t' | tr '\t' ' ' | wc -L

2
エンツォのおかげでman wc、この問題については言及していませんが、info coreutils 'wc invocation'(「男」も参照)に記載されていることがわかりました...また、google-sphereをもう少しトロールした後、これを代替として見つけましたecho -n $'\t' | expand -t1 | wc -L、これは他の選択肢とほとんど同じですが、適切な方法でそれをスローしました。そして、次のリンクはwc hack *を再コンパイルしますが、興味があるかもしれません:異なるタブ幅のwcサポート
Peter.O

1

通常、タブは次の位置(8で割り切れる)+1 [1, 9, 17, 25, ...]に展開されるため、要求すると取得されます。

-nは質問とは無関係ですが、$はそうではないことに注意してください。

echo foo$'\t' | wc -L

8も返されます、なぜなら

echo foo$'\t'bar 
foo     bar

エコーに-eを使用する場合、$は省略できます。

echo -e '\t' | wc -L
8

したがって、 '\ t'を1バイトとしてカウントする場合は、-eと$を省略します。

echo '\t' | wc -L
2

はい、タブを拡張すると、そのプログラムに印刷/表示出力するための共通十分ですが、私は奇妙なことを発見したカウントバイトと言葉は数えるだろう1以外などの文字1つの文字を...ところでecho '\t'出力せず、タブ文字(\ x09)。長さが2の行を出力します。a '\'およびa 't'。改行は行の長さの一部ではありません...(末尾の改行文字を持たないファイルを適切に処理する-nかどうかを確認するための例がありましたwc...)
Peter.O

wc --help言う:-L, --max-line-length print the length of the longest line?。バイトについてではなく、行の長さについて話します。
ユーザー不明

1
はい、それは言ってない「最長の行の長さを印刷する」 ... `それは言っていない で、ああ...私たちはあなたのタブが(他のほとんどの長さの関数のように、ではない通常の文字カウント)を拡大したいとし」方法では、特定のタブストップの設定に関係なく、タブを8スペースに拡張します。」 ...それがトラップです。適切に文書化されていません。
Peter.O

どのようにタブを設定しますか?バッシュで?さらに:タブは8つのスペースに展開されるのではなく、位置に、参照しecho -e foo'\t'bar | wc -Lていない14に、11をもたらす
ユーザー不明

上記のfoo\tbar例でwcは、公称間隔8のタブストップを想定しています...次の例は、現在アクティブなタブストップ設定を無視する方法を示しています。これは、広い/ロング8端末の列である端子にラインを出力し、まだそれが11すべき報告書は、この例のセットごとに6列...に、タブは、停止したwcwctabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

wc -Lの説明はあいまいでした。最も広い表示幅を返します。タブの展開を制御するには、expand最初にフィルタリングできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.