Можно ли найти какие-либо строки в файле, которые превышают 79 символов?
источник
Можно ли найти какие-либо строки в файле, которые превышают 79 символов?
В порядке уменьшения скорости (в системе GNU в локали UTF-8 и на входе ASCII) согласно моим тестам:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
За исключением perl
¹ one (или для awk
/ grep
/ sed
реализаций (например, mawk
или busybox), которые не поддерживают многобайтовые символы), он считает длину в терминах количества символов (в соответствии с LC_CTYPE
настройкой локали) вместо байтов .
Если во входных данных есть байты, которые не образуют часть допустимых символов (что иногда случается, когда набор символов локали UTF-8, а входные данные находятся в другой кодировке), то в зависимости от решения и реализации инструмента эти байты будет считаться как 1 символ или 0 или не совпадать .
.
Например, строка, состоящая из 30 a
sa 0x80 байтов, 30 b
s, 0x81 байтов и 30 UTF-8 é
s (кодированных как 0xc3 0xa9), в локали UTF-8 не будет совпадать .\{80\}
с GNU grep
/ sed
(так как этот автономный байт 0x80 не соответствует .
), будет иметь длину 30 + 1 + 30 + 1 + 2 * 30 = 122 с perl
или mawk
, 3 * 30 = 90 с gawk
.
Если вы хотите посчитать в байтах, исправьте локаль с C
помощью LC_ALL=C grep/awk/sed...
.
Это будет иметь все 4 решения, учитывая, что строка выше содержит 122 символа. За исключением perl
инструментов in и GNU, у вас все еще могут возникнуть проблемы со строками, содержащими символы NUL (0x0 байт).
Variable на perl
поведение может повлиять PERL_UNICODE
переменная окружения, хотя
awk
может подойти ближе, если уронить($0)
, что в любом случае неявно;).^
, это немного быстрее: напримерgrep '^.\{80\}' file
.grep '^.\{1000\}' file
возвращаетсяgrep: invalid repetition count(s)
, покаawk 'length>1000' file
успешно.)Shell подход:
Python подход:
Или как краткий скрипт для удобства чтения:
Если мы хотим , чтобы исключить символ новой строки
\n
из расчетов, мы можем сделатьif len(line) > 79
бытьif len(line.strip()) > 79
Примечание: это синтаксис Python 2.7. Используйте
print()
для Python 3источник