我需要在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 ”不是上述命令的输出。
第一个命令出了什么问题?
答案 0 :(得分:1)
您确实会错过一个$,以说它的行尾。在星号前面加上一个点以赋予任何字符。
grep -i '^[aeiou].*[aeiou]$'
编辑以处理一个字符,将最后一部分设为可选
grep -i -E '^[aeiou](.*[aeiou])?$'
答案 1 :(得分:1)
原始的^[aeiou]*[aeiou]
POSIX BRE模式与^
匹配行的开头,然后匹配0或更多(因为*
是匹配0或更多出现的修饰符的量词子模式)a
,e
,i
,o
或u
字符,然后匹配这些字符中的任何一个。因此,它匹配abc
或a
或aei=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]
-指定的字符之一$
-行尾。