Использование grep и regex для извлечения слов из файла, который содержит только один вид гласных - PullRequest
1 голос
/ 21 сентября 2019

У меня есть большой файл словаря, который содержит одно слово в строке.

Я хочу извлечь все строки, содержащие только один вид гласных, так что "видеть" и "лучше всего" и "левее" и "всякий раз, когда «будет извлечен, но« как »или« дом »или« и »не будет.Хорошо, что мне нужно несколько раз просмотреть файл, меняя гласную, которую я ищу каждый раз.

Эта команда: grep -io '\b[eqwrtzpsdfghjklyxcvbnm]*\b' dictionary.txt

не возвращает слов, содержащих другие гласныено E, но это также дает мне такие слова, как BBC или BMW.Как я могу сделать содержащуюся в нем гласную требование?

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Как насчет

grep -i '^[^aiou]*e[^aiou]*$'

?

0 голосов
/ 21 сентября 2019

Вот попытка Awk, которая собирает все попадания за один проход по входному файлу, а затем печатает каждое ведро.

awk 'BEGIN { split("a:e:i:o:u", vowel, ":")
    c = "[b-df-hj-np-tv-z]"
    for (v in vowel)
      regex = (regex ? regex "|" : "") "^" c "*" vowel[v] c "*(" vowel[v] c "]*)*$" }
    $0 ~ regex { for (v in vowel) if ($0 ~ vowel[v]) {
        hit[v] = ( hit[v] ? hit[v] ORS : "") $0
        next } }
    END { for (v in vowel) {
        printf "=== %s ===\n", vowel[v]
        print hit[v] } }' /usr/share/dict/words

Вы заметите, что оно печатает слова с слоговым y как jolly и цикл. Более сложное регулярное выражение должно исправить это, хотя для действительно сложных случаев (таких как рифма ) нужна более сложная модель английского языкаорфография.

Регулярное выражение неуклюже, потому что Awk не поддерживает обратные ссылки;более ранняя версия этого ответа содержала более простое регулярное выражение, которое работало бы с grep -E или аналогичным, но затем собирало все совпадения в одном сегменте.

Демо: https://ideone.com/wNrvPu

0 голосов
/ 21 сентября 2019

Использование опции -P (perl):

^(?=.*e)[^aiou]+$

Объяснение:

^               # beginning of line
    (?=.*e)     # positive lookahead, make sure we at least 1 "e"
    [^aiou]+    # 1 or more any character that is not vowel 
$               # end of line

cat file.txt
see
best
levee
whenever
like
house
and
BBC 
BMW

grep -P '^(?=.*e)[^aiou]+$' file.txt
see
best
levee
whenever
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...