Как grep для слов с точным количеством вхождений буквы?

Я пытаюсь написать скрипт, который ищет словарь для слов, которые содержат ровно два вхождения каждой буквы. Я просто не синтаксис grep для ровно двух вхождений буквы.

0
задан 10 April 2018 в 17:55

2 ответа

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

например. найти в любом месте , состоящий из ровно двух экземпляров буквы q, нечувствительных к регистру, в /usr/share/dict/words:

$ grep -wi '[^q]*q[^q]*q[^q]*' /usr/share/dict/words Albuquerque Albuquerque's Qiqihar Qiqihar's

Если вы не ограничены grep в частности, вы можете рассмотреть возможность использования perl, где вы можете использовать тот факт, что при оценке в скалярном контексте команда tr возвращает количество транслитераций, например

perl -ne 'print if tr/qQ/qQ/ == 2' /usr/share/dict/words

В аналогичном ключе с GNU awk вы можете определить интересующий персонаж как шаблон поля и проверить количество полей:

gawk -vFPAT='[qQ]' 'NF==2' /usr/share/dict/words
3
ответ дан 17 July 2018 в 17:06

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

например. найти в любом месте , состоящий из ровно двух экземпляров буквы q, нечувствительных к регистру, в /usr/share/dict/words:

$ grep -wi '[^q]*q[^q]*q[^q]*' /usr/share/dict/words Albuquerque Albuquerque's Qiqihar Qiqihar's

Если вы не ограничены grep в частности, вы можете рассмотреть возможность использования perl, где вы можете использовать тот факт, что при оценке в скалярном контексте команда tr возвращает количество транслитераций, например

perl -ne 'print if tr/qQ/qQ/ == 2' /usr/share/dict/words

В аналогичном ключе с GNU awk вы можете определить интересующий персонаж как шаблон поля и проверить количество полей:

gawk -vFPAT='[qQ]' 'NF==2' /usr/share/dict/words
3
ответ дан 23 July 2018 в 17:57
  • 1
    +1, В моих ушах вопрос звучит так, как будто ответ должен быть: for i in {a..z}; do grep -wi "[^${i}]*${i}[^${i}]*${i}[^${i}]*" /usr/share/dict/words; done :) – pa4080 10 April 2018 в 21:28
  • 2
    @ pa4080 уверен, но OP должен ожидать выполнения работы - они сказали, что они сказали «Я просто не синтаксис grep для ровно двух вхождений буквы» [ ! d1] в конце концов ... – steeldriver 10 April 2018 в 21:30

Другие вопросы по тегам:

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