wc -L, sekme karakteri için 8 satır uzunluğunu bildirir. hata veya özellik?


12

-Lyararlı bir özellik wc, ya da ben öyle düşündüm. En uzun çizginin uzunluğunu yazdırır. Bazı nedenlerden dolayı tek baytlık bir sekme karakterini 8 uzunluğa
genişletir. Bunu sekmeyi "genişletmemek" için ayarlamanın bir yolu var mı? ve bu genişlemenin ardındaki mantık ne olabilir?

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

çıktılar 8

wc (GNU coreutils) 7.4
GNU bash, sürüm 4.1.5


-N soruya diktir.
kullanıcı bilinmiyor

Yanıtlar:


11

Bununla ilgili hiçbir hata raporu bulamıyorum ve kaynak dosyada aşağıdaki satırlar var wc.c

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

muhtemelen bu şekilde davranmayı seçiyor gibi görünüyor, muhtemelen dosyayı ekranda görüntülemek için gereken genişlik için bir ipucu veriyor.

Hızlı bir alternatif olabilir

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

2
Teşekkürler enzo, şimdi man wcbu konuyu hiç belirtmese de info coreutils 'wc invocation'(ki 'adam' da atıfta bulunuyor) ifadesinde bulundu ... Ayrıca, google-küre biraz daha trol ettikten sonra, bunu alternatif olarak buldum echo -n $'\t' | expand -t1 | wc -L, bu da alternatifinizle hemen hemen aynı, ancak iyi bir ölçü için onu attım .. Ve aşağıdaki bağlantı yeniden derlenmiş bir wc hack * olsa da, bazıları için ilgi çekici olabilir: farklı sekme genişlikleri için wc desteği
Peter.O

1

Normalde bir sekme bir sonraki konuma genişletilir, (8 ile bölünebilir) +1 [1, 9, 17, 25, ...], bu yüzden isterseniz, alırsınız.

Unutmayın, -n soru ile alakasızdır, ancak $ değildir.

echo foo$'\t' | wc -L

8 de geri dönecek, çünkü

echo foo$'\t'bar 
foo     bar

Echo için -e kullanırsanız $ 'ı atlayabilirsiniz:

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

Eğer '\ t' değerini tek bir bayt olarak saymak istiyorsanız, -e ve $ parametrelerini atlayın:

echo '\t' | wc -L
2

Evet, sekmeleri genişleyen bir program baskılı / Görüntülenen çıkışı için ortak yeterli, ama garip buldum sayımları bayt ve sözcükler sayılır 1 dışındaki bir şey olarak karakterini 1 karakteri ... Btw echo '\t'değil çıktı sekme karakter (\ X09). Uzunluğu 2 olan bir çizgi çıkarır, yani. a '\'ve a 't'. Bir yeni satır satır uzunluğunun -nwc
ayrıştırılması değildir

wc --helpdiyor ki: -L, --max-line-length print the length of the longest line?. Baytlardan değil, satır uzunluklarından bahsediyor.
kullanıcı bilinmiyor

1
Evet, diyor "en uzun hat uzunluğu yazdırmak" ... `ama söylemez Size sekmeleri (çoğu diğer uzunluk fonksiyonları gibi olağan karakter sayısı değil) genişletilmiş farzedelim" .. Ah, tarafından bu şekilde, sekmelerinizin durduğu yere bakılmaksızın sekmeleri 8 aralığa genişleteceğiz. " ... Bu tuzak .. Doğru belgelenmemiş.
Peter.O

Sekmeyi nasıl ile ayarlarsınız? Bash'te mi? Ayrıca: Sekmeler 8 boşluğa değil, konumlara genişletilir echo -e foo'\t'bar | wc -L. 14'de değil, 11'de hangi sonuçların elde edildiğine bakın .
kullanıcı bilinmiyor

Yukarıdaki foo\tbarörnekte, 8 nominal nominal aralıkta sekme durakları wcolduğu varsayılmıştır ... Aşağıdaki örnek, geçerli olarak etkin sekme durdurma ayarlarının nasıl yoksayıldığını gösterir . 8 terminal sütunu geniş / uzun olan terminale bir hat verir, ancak 11 olarak rapor eder. Bu örnek, her 6 sütuna sekme duraklarını ayarlar ...wcwctabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

Wc -L açıklaması belirsizdi. En geniş ekran genişliğini döndürür. Sekme genişletmeyi kontrol etmek için expandönce filtreleyebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.