wc -L zgłasza długość linii 8 dla tab-char. błąd lub funkcja?


12

-Ljest przydatną funkcją wc, a przynajmniej tak myślałem. Drukuje długość najdłuższej linii. Z jakiegoś powodu rozszerza jednobajtowy tab-char do długości 8.
Czy istnieje jakiś sposób, aby ustawić to, aby nie „rozszerzać” tabulatora? i jakie może być uzasadnienie tego rozszerzenia?

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

wyjścia 8

wc (GNU coreutils) 7.4
GNU bash, wersja 4.1.5


-N jest ortogonalna dla pytania.
użytkownik nieznany

Odpowiedzi:


11

Nie znalazłem powiązanego z tym zgłoszenia błędu i następujących wierszy w pliku źródłowym wc.c

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

wydają się celowo wybierać takie zachowanie, prawdopodobnie podając wskazówkę dotyczącą szerokości potrzebnej do wyświetlenia pliku na ekranie.

Szybka alternatywa może być

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

2
Dzięki enzo, teraz odkryłem, że chociaż man wcnie wspomina o tym problemie, jest to określone w info coreutils 'wc invocation'(który odnosi się również do „człowieka”) ... Ponadto, po dokładniejszym przeszukaniu sfery Google, znalazłem to jako alternatywę echo -n $'\t' | expand -t1 | wc -L, który jest prawie taki sam, jak twoja alternatywa, ale wrzuciłem go w dobrym celu .. I chociaż poniższy link to rekompilacja hacka wc * , może być interesujące dla niektórych: obsługa wc dla różnych szerokości tabulatorów
Peter.O

1

Zwykle karta jest rozwijana do następnej pozycji (podzielna przez 8) +1 [1, 9, 17, 25, ...], więc jeśli poprosisz o nią, otrzymasz ją.

Zauważ, że -n nie ma znaczenia dla pytania, ale $ nie.

echo foo$'\t' | wc -L

zwróci również 8, ponieważ

echo foo$'\t'bar 
foo     bar

Możesz pominąć $, jeśli używasz -e dla echa:

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

Więc jeśli chcesz policzyć „\ t” jako pojedynczy bajt, po prostu pomiń -e i $:

echo '\t' | wc -L
2

Tak, rozwijanie tabulatorów jest na tyle powszechne, że drukowane / wyświetlane dane wyjściowe są dziwne, ale program, który liczy bajty i słowa, liczy 1 znak jako dowolny inny niż 1 znak ... btw echo '\t'nie wyświetla tab-char (\ x09). Wyprowadza linię o długości 2, tj. a '\'i a 't'. Nowa linia nie jest częścią długości linii ... ( -nW moim przykładzie miałam do sprawdzenia, czy wcpoprawnie przetworzy plik, który nie ma końcowego znaku nowej linii ...)
Peter.O

wc --helpmówi: -L, --max-line-length print the length of the longest line?. Nie mówi o bajtach, ale o długości linii.
użytkownik nieznany

1
Tak, mówi „drukuj długość najdłuższej linii” ... „ale nie mówi „ Zakładamy, że chcesz rozszerzyć tabulatory (nie zwykła liczba znaków, jak większość innych funkcji długości). Och, przez w ten sposób rozwiniemy tabulatory do 8 spacji, niezależnie od tego, na jakie ustawione są określone tabulatory ”. ... To pułapka. Nie jest odpowiednio udokumentowana.
Peter.O,

Jak ustawić kartę? W Bash? Ponadto: Tabulatory nie są rozszerzane do 8 spacji, ale do pozycji, zobacz, echo -e foo'\t'bar | wc -Lktóre wyniki dają 11, a nie 14
użytkownik nieznany

W powyższym foo\tbarprzykładzie, wcnie zakłada tab-zatrzymuje się przy nominalnym rozstawie 8 ... Poniższy przykład pokazuje w jaki sposób wcignoruje aktualnie aktywne ustawienia tab-stop. Wyprowadza wiersz do terminala, który ma szerokość / długość 8 terminali-kolumn, ale wczgłasza, że ​​to 11. Ten przykład ustawia tabulatory w każdej 6-tej kolumnie ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O,

0

Opis wc -L był niejednoznaczny. Zwraca najszerszą szerokość wyświetlania. Aby kontrolować rozwijanie kart, możesz expandnajpierw przefiltrować .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.