Regex 为什么这个grep命令没有带任何东西回来?(猛击)
我有一个文本文件“samp”,我只想grep以大写元音开头和结尾的行 使用“Regex 为什么这个grep命令没有带任何东西回来?(猛击),regex,bash,grep,Regex,Bash,Grep,我有一个文本文件“samp”,我只想grep以大写元音开头和结尾的行 使用“grep^[AEIOU]samp”有效。 使用“grep[AEIOU]$samp”也可以 但是当尝试将它们组合到“grep^[AEIOU]$samp”时,它不会返回任何结果 三件事: 是的,我在samp中有以大写元音开头和结尾的行 是的,我尝试了我能想到的所有引语组合。没什么了 是的,我是unix新手 您的模式允许一行中只有一个元音。尝试: grep ^[AEIOU].*[AEIOU]$ 请注意,这将不会与单个元音
grep^[AEIOU]samp
”有效。使用“
grep[AEIOU]$samp
”也可以
但是当尝试将它们组合到“grep^[AEIOU]$samp
”时,它不会返回任何结果
三件事:
- 是的,我在samp中有以大写元音开头和结尾的行李>
- 是的,我尝试了我能想到的所有引语组合。没什么了李>
- 是的,我是unix新手
- 您的模式允许一行中只有一个元音。尝试:
grep ^[AEIOU].*[AEIOU]$
请注意,这将不会与单个元音的行匹配,如果您也需要,那么我们需要更聪明一些,并使用一些“或” 您的“组合”示例正在查找由一行上的单个大写元音组成的行!你想要的是:
grep '^[AIOUE].*[AIOUE]$' samp
你给出的是一个grep,表示正好是1个大写元音的行 试试这个:
<cmd> | grep '[AEIOU]$' | grep '^[AEIOU]'
| grep'[AEIOU]$'| grep'^[AEIOU]'
我确信它可以用一个grep来完成,但是我对unix grep不是很熟悉。如果正则表达式与perl类似,那么它就是
<cmd> | grep '^[AEIOU](.*[AEIOU])?$'
| grep'^[AEIOU](.[AEIOU])?$'
在讨论grep时,Jeffrey Friedl的《掌握正则表达式》第一版在第182页的表6-1中有一个“对一些常见程序风格的初步调查”
他说“即使是像grep这样简单的东西,变化也很大”
grep中的正则表达式与Perl不同
即使带有扩展正则表达式的egrep也不一样,但我发现它更易于使用。这将匹配一行,该行只包含任意数量的大写元音(这包括零,因此它匹配空行): 这匹配仅由一个或多个大写元音组成的行(不匹配空行):
这两个选项中的任何一个都将匹配只包含一个大写元音的行。使用egrep,您可以执行以下操作:
echo $'hello\nworld' | egrep '^h|d$'
唯一的问题是它不能匹配一行上只有一个大写元音的行。这更像是一个超级用户类型的问题。@cletus,虽然grep是一个工具,但问题实际上围绕正则表达式(以及各种grep对PCRE的理解程度)。^=行的开始,[AEIOU]=该集合的一个字符,$=行的结束。你有只包含A、E、I、O或U的行吗?我拿出了NPR和BOS标签,尽管我有两个想法。grep和所有其他工具在bash程序中经常使用,不仅仅是命令行中的命令,我更愿意对此表示怀疑。@scrible正如@tster在另一个答案中指出的,您的正则表达式不会匹配一行上正好有一个大写元音的行。我添加了引号,以便bash不会试图处理括号和$符号。也更喜欢第一个,因为对于简单的REs,grep通常更快(即使有两个进程正在运行)。同意,*nix专门通过类似的程序进行管道输出。
grep -E '^[AEIOU]+$'
echo $'hello\nworld' | egrep '^h|d$'