wc -L melaporkan panjang baris 8 untuk tab-char. bug atau fitur?


12

-Ladalah fitur yang berguna wc, atau jadi saya pikir. Ini mencetak panjang garis terpanjang. Untuk beberapa alasan ia memperluas satu-byte tab-char ke panjang 8.
Apakah ada cara untuk mengatur ini agar tidak "memperluas" tab? dan apa yang mungkin menjadi alasan di balik ekspansi ini?

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

output 8

wc (GNU coreutils) 7.4
GNU bash, versi 4.1.5


-N adalah ortogonal terhadap pertanyaan.
pengguna tidak diketahui

Jawaban:


11

Saya tidak menemukan laporan bug yang terkait dengan ini, dan baris berikut di file sumber wc.c

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

tampaknya sengaja memilih untuk berperilaku seperti ini, mungkin untuk memberikan petunjuk tentang lebar yang dibutuhkan untuk menampilkan file di layar.

Alternatif cepat bisa jadi

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

2
Terima kasih Enzo, saya sekarang telah menemukan bahwa meskipun man wctidak menyebutkan masalah ini, dinyatakan dalam info coreutils 'wc invocation'(yang 'merujuk' juga) ... Juga, setelah menjelajah google-sphere sedikit lebih, saya menemukan ini sebagai alternatif echo -n $'\t' | expand -t1 | wc -L, yang hampir sama dengan alternatif Anda, tetapi saya telah melemparkannya untuk mengukur dengan baik .. Dan meskipun tautan berikut ini adalah kompilasi ulang wc hack * , mungkin menarik bagi sebagian orang: dukungan wc untuk lebar tab berbeda
Peter.O

1

Biasanya tab diperluas ke posisi berikutnya, (habis dibagi 8) +1 [1, 9, 17, 25, ...], jadi jika Anda memintanya, Anda mendapatkannya.

Perhatikan, bahwa -n tidak relevan untuk pertanyaan, tetapi $ tidak.

echo foo$'\t' | wc -L

akan mengembalikan 8 juga, karena

echo foo$'\t'bar 
foo     bar

Anda dapat menghilangkan $, jika Anda menggunakan -e untuk gema:

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

Jadi jika Anda ingin menghitung '\ t' sebagai byte tunggal, cukup hapus -e dan $:

echo '\t' | wc -L
2

Ya, memperluas tab cukup umum untuk keluaran yang dicetak / ditampilkan, tetapi saya merasa aneh bahwa program yang menghitung byte dan kata-kata akan menghitung 1 karakter selain dari 1 karakter ... btw echo '\t'tidak menampilkan tab-char (\ x09). Ini menghasilkan garis yang panjangnya 2, yaitu. a '\'dan a 't'. Baris baru bukan bagian dari panjang baris ... (Saya punya -ndalam contoh saya untuk memeriksa apakah wcakan memproses file yang tidak memiliki trailing baris-char ...)
Peter.O

wc --helpmengatakan: -L, --max-line-length print the length of the longest line?. Itu tidak berbicara tentang byte, tetapi panjang garis.
pengguna tidak diketahui

1
Ya, ia mengatakan "cetak panjang garis terpanjang" ... `tetapi tidak mengatakan " Kami berasumsi bahwa Anda ingin tab diperluas (bukan jumlah karakter yang biasa, seperti kebanyakan fungsi panjang lainnya) .. Oh, oleh cara, kami akan memperluas tab ke 8 spasi, terlepas dari apa tab spesifik Anda berhenti diatur ke. " ... Itu jebakan .. Ini tidak didokumentasikan dengan baik.
Peter.O

Bagaimana Anda mengatur tab? Di Bash? Selanjutnya: Tab tidak diperluas ke 8 spasi, tetapi ke posisi, lihat echo -e foo'\t'bar | wc -Lhasil di 11, bukan di 14.
pengguna tidak diketahui

Dalam contoh di atas foo\tbarmisalnya, wctelah diasumsikan tab-berhenti pada jarak nominal 8 ... Contoh berikut menunjukkan bagaimana wcmengabaikan pengaturan tab-stop yang sedang aktif. Ini mengeluarkan garis ke terminal yang lebar / panjangnya 8 terminal-kolom, namun wcmelaporkannya menjadi 11. Contoh ini mengatur penghentian tab untuk setiap kolom ke-6 ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

Deskripsi wc -L tidak jelas. Ini mengembalikan lebar tampilan terluas. Untuk mengontrol ekspansi tab, Anda dapat memfilter expandterlebih dahulu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.