2009-03-06

grep命令中的全字匹配

grep命令中的-w选项,以及其中正则表达式的\b, \< \>都可以全字区配(整字匹配).那它们有什么区别呢?

先要明确“全字匹配”的含义。“全字匹配”是指匹配的部分两边没有word constituent(字母、数字和下划线),而不是要求匹配的部分全部由word constituent组成。例如, 在"@@hello@@""查找'@hello@'的时候,是满足全字匹配的,因为它两边都是@,而@不是word constituent.

-w 是指与整个正则表达式匹配的部分是"全字匹配"

\b和\< \>不要求与整个正则表达式怎么样,而只分别要求在两个\b和\< \>之间的要是"全字匹配".此外,\b表示的是 the empty string at the edge of a word,而\< \> RESPECTIVELY match the empty string at the beginning and end of a word. 所以,在"@@hello@@""查找'@hello@'的时候,用-w可以匹配,但是用\b或\< \>都不可以,因为夹在两个@之间的empty string不是word的edge,也不是word的beginning或ending. 同时要注意,红色部分说明了\< \>和\b的不同. 这点看下面例子:

(下面几行保存在文件grep.test里)

kk@bb
kk@abb

grep '\b.bb\b' grep.test 可以在上面两行找到匹配,而grep '\<.bb\>' grep.test只能在第二行找到匹配.用\b的时候,在第一行里,正则表达式里的"."匹配了@.左边的\b匹配的是kk后面的empty string;第二行里,"."匹配了a,左边的\b匹配的是abb前面的empty string. 而用\< \>的时候,第一行kk后面的empty string不能与\<匹配,因为这个empty string是the end of a word,而\<匹配的是the beginning of a word

可以说,-w, \b, \< \>的要求的具体性是逐步上升的


转载请注明出处 http://fornote.blogspot.com/

1 条评论:

  1. 感谢!解决了困惑我很久的问题。

    回复删除