Відповіді:
У порядку зменшення швидкості (в системі GNU в локалі UTF-8 та на вході ASCII) відповідно до моїх тестів:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
За винятком perl
¹ одного (або для awk
/ grep
/ sed
реалізацій (наприклад, mawk
або зайнятої області), які не підтримують багатобайтові символи), він рахує довжину в кількості символів (відповідно до 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
інструментів та GNU, у вас все ще будуть потенційні проблеми для рядків, що містять символи NUL (0x0 байт).
¹ Хоча на perl
поведінку може впливати PERL_UNICODE
змінна середовища
awk
може підійти ближче, якщо ви кинете ($0)
, що все одно неявне;).
^
, це трохи швидше: наприклад grep '^.\{80\}' file
.
grep '^.\{1000\}' file
повертається grep: invalid repetition count(s)
, поки це awk 'length>1000' file
вдається.)
Шелл підхід:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
Підхід Python:
python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt
Або як короткий сценарій для читабельності:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
Якщо ми хочемо , щоб виключити символ нового рядка \n
з розрахунків, ми можемо зробити if len(line) > 79
бутиif len(line.strip()) > 79
Бічна примітка: це синтаксис Python 2.7. Використовуйте print()
для Python 3