Linux Ubuntu Bash-使用AWK正则表达式查找包含2个以上元音的单词

Linux Ubuntu Bash-使用AWK正则表达式查找包含2个以上元音的单词,linux,bash,awk,Linux,Bash,Awk,我想使用awk打印文件中包含2个以上元音的所有单词 这是我目前的代码: #!/bin/bash cat $1 | awk '{ #Default file separator is space for (i=1;i<=NF;i++) #for every word { if ($i ~ /([aeiojy]){2,}/) { print $i } }}' #/bin/bash cat$1 | awk'

我想使用awk打印文件中包含2个以上元音的所有单词

这是我目前的代码:

#!/bin/bash
cat $1 | awk '{   #Default file separator is space 
for (i=1;i<=NF;i++)  #for every word          
  {
  if ($i ~ /([aeiojy]){2,}/)            
    {
      print $i
    }
}}'
#/bin/bash
cat$1 | awk'{#默认文件分隔符为空格

对于(i=1;i您可以在
awk
中使用
split
功能:

awk -v RS=' ' 'split($0, a, /[aeiouAEIOU]/) > 2' file
  • -vrs=''
    将把每个用空格分隔的单词作为单独的记录进行处理
  • split
    将返回大于2的值,前提是单词中至少有2个元音

这应该适用于GNU
grep

grep -Poi '([^[:space:]]*?[aeiou]){3,}[^[:space:]]*' file
选项:

-P perl compatible regular expressions
-o output every match on a single line
-i case insensitive match
正则表达式:

(                start of subpattern
  [^[:space:]]*  zero or more arbitrary non whitespace characters
  ?              ungreedy quantifier for the previous expression (perl specific)
  [aeiou]        vowel
)                end of subpattern
{3,}             the previous expression appears 3 or more times
[^[:space:]]*    zero or more other characters until word boundary.

顺便说一句,这里实际上不需要perl兼容的正则表达式。使用plain
grep
可以使用:

grep -oi '\([^[:space:]aeiou]*[aeiou]\)\{3,\}[^[:space:]]*' file


注意:在上面的示例中,我排除了标点符号,但如果需要,可以添加标点符号。

谢谢您的回复!您测试过吗?这会打印所有内容,也打印没有元音的单词。据我所知,拆分函数将第一个参数(在本例中为整行($0))放入进入数组“a”,由第三个参数(元音)表示。因此,我们以以元音分隔的单词结束。是吗?这不起作用:PI不会在未经测试的情况下发布awk命令。在Ubuntu上尝试以下操作:
awk-v RS=''split($0,a,/[aeiou]/)>2'文件
@anubhava你能解释一下为什么你的第一个版本不能在Ubuntu上运行吗?@MichaelVehrs:那是因为Ubuntu附带的默认awk不是gnu awk,这就是为什么它不支持将
[[:blank::]
正则表达式作为记录分隔符。谢谢回复!只需要将3改为2(2个以上元音).Grep很好,但awk不可能吗?不客气。不过,你的问题不止两个。这意味着至少有3个元音。是的,我的错。不管怎样,干得好:)