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
Дякую, Enzo, я зараз виявив, що, хоча man wcне згадує про це питання, він зазначається у info coreutils 'wc invocation'(на що також йдеться "man") ... Також, трохи більше потрапивши в сферу google, я знайшов це як альтернативу echo -n $'\t' | expand -t1 | wc -L, що майже так само, як і ваша альтернатива, але я її заздалегідь підкинув .. І хоча наступне посилання - це перекомпіляція злому 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" як один байт, просто опустіть -e і $:

echo '\t' | wc -L
2

Так, розширення вкладок досить поширене для друкованого / відображеного виводу, але мені здається дивним, що програма, яка рахує байти та слова, зараховуватиме 1 символ як що-небудь, крім 1 символу ... btw echo '\t'не видає вкладку char (\ x09). Він виводить лінію, довжина якої 2, тобто. a '\'і a 't'. Новий рядок не є партером довжини рядка ... (У мене був -nу своєму прикладі, щоб перевірити, чи wcправильно оброблятиме файл, у якому немає
зворотного

wc --helpкаже: -L, --max-line-length print the length of the longest line?. Тут йдеться не про байти, а про довжину рядків.
користувач невідомий

1
Так, він говорить "надрукувати довжину найдовшого рядка" ... ", але він не говорить " Ми припускаємо, що ви хочете розширити вкладки (не звичайний кількість символів, як більшість інших функцій довжини). Таким чином, ми розширимо вкладки на 8 пробілів, незалежно від того, для чого встановлені ваші конкретні зупинки вкладки. " ... Це пастка .. Це не належним чином задокументоване.
Пітер.O

Як встановити вкладку? В Баш? Крім того: вкладки розширюються не на 8 пробілів, а на позиції, дивіться, echo -e foo'\t'bar | wc -Lщо призводить до 11, а не до 14
користувач невідомий

У наведеному вище foo\tbarприкладі, wcмає передбачається закладка-зупиняється при номінальному відстані від 8 ... Наступний приклад показує , як wcігнорує активні в даний момент настройки вкладки-стоп. Він виводить рядок до терміналу, який становить 8 / стовпчиків кінцевих стовпчиків / довгий, але wcповідомляє, що це 11. Цей приклад встановлює зупинки табуляції для кожного шостого стовпця ...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O

0

Опис wc -L було неоднозначним. Він повертає найширшу ширину дисплея. Щоб керувати розширенням вкладки, ви можете відфільтрувати expandспочатку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.