2017-08-29 81 views
0

我试图在大写或小写d,后面跟着元音,以小写字母s结尾的文件中找到5个字母的单词。只要符合5个字母的限制,该字词还可以包含特殊字符。这是我提出并且工作的命令,除了一个条目不符合要求。它返回“多丽丝的”,这是一个6字的词。有人可以给我一些指导,说明我做错了什么吗?我在网上搜索,找不到任何与此特别相关的内容。在UNIX中使用grep和通配符

grep -w '[dD][aeiouy]..[s]' /usr/share/dict/words

+0

单词“Doris”满足该模式,因此它返回该行。您可以通过在最后添加'$'来修复您的正则表达式。 – jitendra

+0

也应该在正则表达式的开头添加^。它应该看起来像这样:grep -w'^ [dD] [aeiouy] .. [s] $'/ usr/share/dict/words – jitendra

回答

0

什么的“grep”做你不知道的是,它的打印所有包含“多丽丝”作为一个整体的话,无论是之前或之后任何东西,或没有行。

所以它看到“多丽丝的”,并且由于它包含了整个单词“多丽丝”,它将它打印出来。

它还会打印出“我爱吃曲奇的多丽丝”一行,因为它也包含了“多丽丝”这个单词。

为了得到你想要的,加上“^”的行为和“$”你的正则表达式,像这样:

grep -w '^[dD][aeiouy]..[s]$' /usr/share/dict/words 

这将确保“多丽丝”只有当它的唯一的文本匹配该线。

但是,如果你正在浏览一个“单词”文件(每行一个单词),你真的不需要grep的“-w”开关,因为它已经有(几乎)每行一个单词。

那么试试这个:

grep '^[dD][aeiouy]..[s]$' /usr/share/dict/words 

注意:如果 '^' 和 '$' 不会为你工作,尝试用 “egrep的” 替换 “grep的”,像这样:

egrep '^[dD][aeiouy]..[s]$' /usr/share/dict/words 
+0

我试过这个,当我这样做时,它根本不会返回任何东西。 –

+0

用egrep试试这个,然后: egrep'^ [dD] [aeiouy] .. [s] $'/ usr/share/dict/words –