awk正则表达式匹配问题

时间:2011-07-10 15:08:19

标签: regex bash awk

我在使用带有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

神奇地说,正则表达式匹配第一个文件中的所有单词,但只匹配file.txt中的“unarmadio”(注意两个文件中的“unaaaiuolaa”相同)。

可能有人解释我为什么?

3 个答案:

答案 0 :(得分:1)

在awk中使用循环是一个非常奇怪的结构;我只是做

awk '/^un.{2,}[aeiouAEIOU]{2}$/' < file.txt

答案 1 :(得分:1)

下面的另一种方法,如果你在一行中有多个单词,请使用你问题中给出的for循环方法(一种常用方法来处理由FS变量给出的行中的每个项目)。在应用regexp之前检查长度,regexp使用贪婪的运算符表示“任意字符”,然后使用2个相同的字符类来确保项目以2个元音结尾。

{ for(k=1; k<=NF; k++)  {
        if (length($k) > 5) {
            if ($k ~ /^un.*[aeiou][aeiou]$/) {
                print $k;
            }
        }
    }
}

答案 2 :(得分:0)

正如grok12所说,问题是“unaaaiuolaa”末尾的一个空白区域。删除它解决了这个问题。