我在使用带有awk的正则表达式时遇到了问题。特别是我需要找到文件中的所有单词:
(这些条件必须同时验证) 我用过这个正则表达式
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”相同)。
可能有人解释我为什么?答案 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”末尾的一个空白区域。删除它解决了这个问题。