我有一个文本文件'samp',我只想要用大写元音开头和结尾的行。
使用“grep ^[AEIOU] samp
”有效
使用“grep [AEIOU]$ samp
”也可以。
但是当尝试将它们组合到“grep ^[AEIOU]$ samp
”时,它什么都不返回。
3件事:
答案 0 :(得分:8)
你所给出的是一个grep,用于正好是1个大写元音的行。
试试这个:
<cmd> | grep '[AEIOU]$' | grep '^[AEIOU]'
我确定可以使用一个grep来完成,但我不太了解unix grep。如果正则表达式像perl那样就是
<cmd> | grep '^[AEIOU](.*[AEIOU])?$'
答案 1 :(得分:1)
你的模式允许线上只有一个元音。尝试:
grep ^[AEIOU].*[AEIOU]$
请注意,现在这不会与具有单个元音的行匹配,如果您也需要它,那么我们需要更聪明一点并使用一些“或”。
答案 2 :(得分:1)
您的“组合”示例正在查找由一行上的单个大写元音组成的行!你想要的是:
grep '^[AIOUE].*[AIOUE]$' samp
答案 3 :(得分:0)
在讨论 grep 时,Jeffrey Friedl的第一版Mastering Regular Expressions在第182页的表6-1中进行了“对少数常见程序风味的表面调查”。
他说“即使像 grep 这样简单的东西也有很大差异”
grep 中的正则表达式与Perl不同。
即使是带有扩展正则表达式的 egrep 也不一样,但我觉得它更容易使用。
答案 4 :(得分:0)
这将匹配仅由任意数量的元首组成的行(这包括零,因此它匹配空行):
grep '^[AEIOU]*$'
这匹配仅由一个或多个大写元素组成的行(与空行不匹配):
grep -E '^[AEIOU]+$'
其中任何一个都匹配一个仅包含一个首都元音的行。
答案 5 :(得分:0)
使用egrep你可以做类似的事情:
echo $'hello\nworld' | egrep '^h|d$'