Awk регулярное выражение соответствия - PullRequest
0 голосов
/ 10 июля 2011

У меня возникла проблема с использованием регулярных выражений с awk. В частности мне нужно найти все слова в файле, которые:

  • начинаются с "un";
  • длиной не менее 6 символов
  • заканчивается двумя гласными

(эти условия должны быть проверены одновременно).
Я использовал это регулярное выражение

cat file.txt | awk '{ for(k=1; k<=NF; k++) 
                         if ($k ~ /^un.{2,}[aeiouAEIOU]{2}$/ ) 
                             print $k; }'

Проблема в том, что иногда работает, а иногда нет.
Я пробовал это с двумя файлами:
test.txt

unaaaiuolaa
unaaaaaa
unbbaa

file.txt

unaaaiuolaa
unarmadio

Таинственно, регулярное выражение соответствует всем словам в первом файле, но только «unarmadio» в file.txt (обратите внимание, что «unaaaiuolaa» одинаково в обоих файлах).

Может кто-нибудь объяснить мне, почему?

Ответы [ 3 ]

1 голос
/ 11 июля 2011

Другой подход ниже, если у вас есть несколько слов в строке, используйте подход цикла for, указанный в вашем вопросе (общий метод для обработки каждого элемента в строке, заданной переменной FS). Проверьте длину перед применением регулярного выражения, которое использует жадный оператор для «любого символа», а затем 2 идентичных символьных класса, чтобы убедиться, что элемент заканчивается 2 гласными.

{ for(k=1; k<=NF; k++)  {
        if (length($k) > 5) {
            if ($k ~ /^un.*[aeiou][aeiou]$/) {
                print $k;
            }
        }
    }
}
1 голос
/ 10 июля 2011

Это очень странная конструкция - использовать цикл в awk; Я бы просто сделал

awk '/^un.{2,}[aeiouAEIOU]{2}$/' < file.txt
0 голосов
/ 19 сентября 2011

Как сказал grok12, проблема заключалась в пустом месте в конце "unaaaiuolaa".Удаление его решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...