为什么这个grep命令没有回来? (击)

时间:2009-10-01 04:14:25

标签: regex bash grep

我有一个文本文件'samp',我只想要用大写元音开头和结尾的行。

使用“grep ^[AEIOU] samp”有效 使用“grep [AEIOU]$ samp”也可以。

但是当尝试将它们组合到“grep ^[AEIOU]$ samp”时,它什么都不返回。

3件事:

  • 是的,我的行以samp中的大写元音开头和结尾。
  • 是的,我尝试了我能想到的每一个引号组合。什么都没有。
  • 是的,我是unix的新手。

6 个答案:

答案 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$'