wc -L сообщает о длине строки 8 для tab-char. ошибка или особенность?


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, я нашел это в качестве альтернативы 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:

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

Поэтому, если вы хотите посчитать '\ t' как один байт, просто опустите -e и $:

echo '\t' | wc -L
2

Да, расширение вкладок достаточно распространено для вывода на печать / вывод на экран, но я нахожу странным, что программа, которая считает байты и слова, будет считать 1 символ чем-либо, кроме 1 символа ... кстати echo '\t', не выводит символ табуляции (\ x09). Он выводит строку, длина которой равна 2, т.е. а '\'и а '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что приводит к 11, а не к 14.
пользователь неизвестен

В приведенном выше foo\tbarпримере, wcимеет предполагается закладка-останавливается при номинальном расстоянии от 8 ... Следующий пример показывает , как wcигнорирует активные в данный момент настройки вкладки-стоп. Он выводит строку на терминал, которая имеет 8 столбцов терминалов в ширину / длину, но wcсообщает, что она равна 11. Этот пример устанавливает табуляцию для каждого 6-го столбца ...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.