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

0

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

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

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

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

Kappa123
источник
1
Ваш предыдущий вопрос показал вам нужно grep -E или избежать скобок. Это должно избавить от ошибки обратной ссылки, вы сможете продолжить сейчас. Почему вы спрашиваете (частично) о той же проблеме? Разве решения другого вопроса не работают на Mac? Если они этого не делают, то правильное решение - дать отзыв пользователям, которые попытались вам помочь, и сначала решить другой вопрос, а не поднимать ту же проблему во второй раз.
Kamil Maciorowski
Ах, я не понимал, что проблема была в E, я просто добавил строку, которую мне дали. Хотя я на самом деле не знаю, куда идти из строки кода, которую я сейчас имею :(.
Kappa123
1
Хорошо, тогда. Если другой вопрос решен, пожалуйста, примите один из ответов там тур чтобы посмотреть, как это работает). Вы также должны редактировать текущий вопрос, поэтому в нем не упоминается «ошибка обратной ссылки», потому что вы знаете, как с ней справиться, и это больше не проблема (и не часть проблемы); сосредоточиться на том, что реальная проблема сейчас , Если "ошибка обратной ссылки" была вашей только вопрос, то этот вопрос должен быть удален или, по крайней мере, закрыт как дубликат другого.
Kamil Maciorowski
Может ли вторая буква совпадать с первой? Может ли третий быть таким же, как второй? ... Пожалуйста, отредактируйте свой вопрос и добавить тестовые случаи.
Toto

Ответы:

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

Toto
источник