Я использую загруженный список слов «Эрудит» с именем «sowpods.txt» и пытаюсь использовать grep чтобы найти все слова по следующим критериям:

  • 7 буквенное слово
  • Начинается и заканчивается одной и той же буквой
  • Имеет ту же вторую, четвертую и шестую букву
  • Имеет другую 3-ю и 5-ю букву

Линия у меня до сих пор

grep -i "^(.).*\1$" sowpods.txt > output.txt

дает мне обратную ссылку, поэтому я попытался использовать онлайн-руководства, но они были безумно запутанными. Это вообще возможно? Если да, может кто-нибудь помочь?

Я на Mac и использую терминал по умолчанию.

1 ответ1

1

Используя опцию -P (PCRE), если она доступна в вашей системе:

grep -P '^(?=[a-zA-Z]{7}$)(.)(?!\1)(.)(?!\1)(?!\2)(.)\2(?!\1)(?!\2)(?!\3).\2\1$' inputfile

Объяснение:

^
  (?=[a-zA-Z]{7}$)  : positive lookahead, zero-length assertion that make sure we have exactly 7 letters. You may use \pL{7} if you want to deal with any laguage
  (.)               : first letter, captured in group 1
  (?!\1)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 1 after
  (.)               : second letter, captured in group 2
  (?!\1)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 1 after
  (?!\2)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 2 after
  (.)               : third letter, captured in group 3
  \2                : fourth letter == second letter
  (?!\1)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 1 after
  (?!\2)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 2 after
  (?!\3)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 3 after
  .                 : fifth letter
  \2                : sixth letter == second letter
  \1                : seventh letter == first letter
$

DEMO

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .