Как «grep» для длины линии в заданном диапазоне?

28

ПРИМЕЧАНИЕ: этот вопрос является дополнением к этим вопросам и ответам: как "grep" для длины строки * не * в данном диапазоне?


Мне нужно получить только строки из текстового файла (словаря, разделенного новой строкой), который имеет диапазон длин не менее 3 символов, но не более 10.

Пример:

ВХОД:

egyezményét
megkíván
ki
alma
kevesen
meghatározó

ВЫХОД:

megkíván
alma
kevesen

Вопрос: Как я могу сделать это в bash?

АРУ
источник
9
grep -x '.\{3,10\}'
Костас
@ Костас гениален, и то же самое касается седа. Отправьте полный ответ.
Орион

Ответы:

37
grep -x '.\{3,10\}'

где

  • -x сопоставить шаблон с целой линией
  • . любой символ
  • {3,10} количественно от 3 до 10 раз превратить предыдущий символ (в случае любых)
Костас
источник
10

используя egrep

egrep '^.{3,10}$'

соответствует от начала до конца строк для 3 или более символов, но не более 10 символов.

repzero
источник
1

Использование sed:

sed '/^.\{3,10\}$/!d'

Или:

sed -r '/^.{3,10}$/!d'
АРУ
источник
0

Использование awk:

awk 'length >= 3 && length <= 10' file

Оператор lengthвозвращает длину $0(текущую запись / строку) по умолчанию, и это используется кодом для проверки, находится ли длина строки в заданном диапазоне. Если у такого теста нет соответствующего блока действий, то действием по умолчанию является печать записи.

Тестирование по приведенным данным:

$ awk 'length >= 3 && length <= 10' file
megkíván
alma
kevesen

Аналогично с Perl:

$ perl -lne '$l=length($_); print if ($l >= 3 && $l <= 10)' file
megkíván
alma
kevesen
Кусалананда
источник