我有一个单词词典,我想做一个测试,看看列表中是否存在生成的单词,所以我使用grep。我的问题是我不能让grep停止返回不需要的目的地。
例如。我想grep单词菜单并返回完全匹配,所以我使用:
grep -iw menu words.dat
这返回了菜单和菜单。我玩过正则表达式,例如:
grep -ie '^menu.' words.dat
这将返回以菜单开头的所有内容以及后面的任意数量的字符。同样,如果我使用相同的命令-w,我仍然可以获得菜单和菜单。
如何限制grep命令在单个字符上执行通配符。
答案 0 :(得分:1)
负面前瞻和后视
grep -iP '(?<![\w\x27])menu(?![\w\x27])' words.dat
我使用了单引号\x27
的ascii代码而不是实际的字符。
实际上,您可以将'
包含在“单词”中,以便进行单词边界考虑。
$ cat words.dat
menu
MENU
notmenu
NOTMENU
menu's
$ grep -iP '(?<![\w\x27])menu(?![\w\x27])' words.dat
menu
MENU
答案 1 :(得分:1)
您误解了-w
标志的含义。你显然要做的是
grep -x menu. words.dat
将要求匹配覆盖整行。
grep
的正常行为是每当正则表达式匹配该行的任何位置时返回整个匹配行。
-w
选项表示必须通过&#34;非单词&#34;将匹配与其他文本隔离开来。字符。 &#34; word&#34;的确切定义vs&#34;非词&#34;也可能取决于您的语言环境,但传统的C / POSIX语义是[a-zA-Z0-9_]
是&#34; word&#34;字符和其他任何东西(又名[^a-zA-Z0-9_]
- 包括,你可能会注意到,撇号和短划线)不是。因此,grep -w menu
将与menu's
匹配,因为与正则表达式匹配的文本与(无)或非单词字符相邻。
-x
选项基本上等同于使用^
(行首)和$
(行尾)锚点包装正则表达式。所以grep -x menu
与grep '^menu$'
相当方便,即匹配行的开头,m,e,n,u,行尾。
为了完整起见,我还要提到-o
,它说只输出匹配的文本。因此grep -o boo <<<'kaboom'
会从匹配的行中打印boo
(并且grep -wo boo <<<'kaboom'
将不会打印任何内容,因为当存在匹配时,它不会与非单词字符相邻,或者什么也不相符。 / p>
答案 2 :(得分:0)
我想我找到了我需要的东西。或似乎有效。
grep -ix '^men.\{2,2\}' words.dat
这会返回以men开头并且后面有一个字符的所有项目。实际上给了我任何以男性开头的4个字母的单词。
感谢那些回复的人。