列出以元音开头和结尾的行

时间:2019-07-13 19:22:02

标签: regex unix grep

我需要在file.txt中列出所有以元音字符(aeiou)开头和结尾的行。

grep -i '^[aeiou]*[aeiou]' file.txt

我的理解是

-i = search with case insensitive
^[aeiou] = search at start of each line
*[aeiou] = search at end of line

不满足这些条件的输出之一是

  

Uabcdh

以上单词以“ u”开头,但没有以[aeiou]结尾

而我在下面尝试了另一种方法

grep -i '^[aeiou]' file.txt | grep -i '[aeiou]$'

和“ Uabcdh ”不是上述命令的输出。

第一个命令出了什么问题?

2 个答案:

答案 0 :(得分:1)

您确实会错过一个$,以说它的行尾。在星号前面加上一个点以赋予任何字符。

grep -i '^[aeiou].*[aeiou]$'

编辑以处理一个字符,将最后一部分设为可选

grep -i -E '^[aeiou](.*[aeiou])?$'

答案 1 :(得分:1)

原始的^[aeiou]*[aeiou] POSIX BRE模式与^匹配行的开头,然后匹配0或更多(因为*是匹配0或更多出现的修饰符的量词子模式)aeiou字符,然后匹配这些字符中的任何一个。因此,它匹配abcaaei=A-O(UB)C D/+1等行。

你想要的是

grep -i '^[aeiou]\(.*[aeiou]\)\{1,0\}$' file.txt # POSIX BRE
grep -i -E '^[aeiou](.*[aeiou])?$' file.txt      # POSIX ERE
grep -i -P '^[aeiou](?:.*[aeiou])?$' file.txt    # PCRE

在PCRE one中,使用了非捕获组(?:...),这在前两种正则表达式中不可用。

所有三个匹配项(POSIX ERE正则表达式说明):

  • ^-行首
  • [aeiou]-指定的字符之一
  • (.*[aeiou])?-可选序列:
    • .*-任意0个以上的字符
    • [aeiou]-指定的字符之一
  • $-行尾。