Как передать файл в качестве входных данных для команды tar

Следующее соответствует любому «слову» в начале строки, состоящей только из 3 одинаковых [ :альфа :] символов:

grep -i '^\([[:alpha:]]\)\1\1\b' 

Или с опциями grep-E(--extended-regexp)или -P(, также известными как--perl-regexp):

grep -iE '^([[:alpha:]])\1\1\b'

grep -iP '^([[:alpha:]])\1\1\b'

Они работают с GNU grep и (, за исключением версии -P)с grep FreeBSD. Они могут не работать с другими версиями grep.


Если вы хотите сопоставить слова любой длины, содержащие 3 или более одинаковых буквенных символов в любом месте, это немного сложнее. Вам нужно использовать отрицательный просмотр вперед , который требует Perl-совместимых регулярных выражений.

т. е. это нельзя сделать сgrep -E(ака egrep, который устарел).

Например:

$ grep -iP '^[[:alpha:]]*([[:alpha:]])((?:(?!\1)[[:alpha:]])*\1){2}[[:alpha:]]*\b' /usr/share/dict/words
Aaliyah
Aaliyah's
Aarau
Aargau
Aaronical
Abadan
Abbottstown
Abbottstown's
Aberdeen
Aberdeen's
...
zoozoo
zoozoos
zuzzes
zwitterionic
zygogeneses
zygomorphous
zymogeneses
zyzzyva
zyzzyvas
zzz

(согласно wc -l, это соответствует 67117 из 344817 слов в моем файле /usr/share/dict/words)


И, наконец, сопоставлять только слова с ровно 3 одинаковых [ :альфа :] где-либо внутри них:

$ grep -iP '^[[:alpha:]]*([[:alpha:]])((?:(?!\1)[[:alpha:]])*\1){2}[[:alpha:]]*\b' /usr/share/dict/words | 
  grep -viP '^[[:alpha:]]*([[:alpha:]])((?:(?!\1)[[:alpha:]])*\1){3}'

Первый grep находит слова с 3 или более одинаковыми символами, а второй исключает слова с 4 или более.

Я не уверен, можно ли это сделать с помощью одного регулярного выражения или нет.

(это соответствует 56820 словам в моем файле /usr/share/dict/words ).

0
01.11.2021, 16:58
0 ответов

Теги

Похожие вопросы