grep 命令 \< 和 \> 的工作方式

grep 命令 \< 和 \> 的工作方式

myfile.txt 包含以下内容:

hello (ab)
hello ab
hello abcd

我尝试过以下命令:

$grep '\<ab\>' myfile.txt

\<表示单词的开始,\>表示单词的结束。

所以我认为我的 grep 命令相当于$grep ' ab ' myfile.txt 。我期望我的输出是

hello ab

但它匹配:

hello (ab)
hello ab

单词是如何定义的?它是一个字符串,前面有一个空格,后面还有一个空格吗?

答案1

man grep

   The Backslash Character and Special Expressions
       The  symbols  \<  and  \>  respectively  match  the empty string at the
       beginning and end of a word.  The symbol \b matches the empty string at
       the  edge  of a word, and \B matches the empty string provided it's not
       at the edge of a word.  The symbol \w is a synonym for [_[:alnum:]] and
       \W is a synonym for [^_[:alnum:]].

换句话说,单词是字母数字字符和下划线的序列,以及词边界是任何其他内容之前或之后的空字符串 - 包括标点符号(例如()以及空格)。所以:

$ echo 'word-boundary' | grep -o '\<\w*\>'
word
boundary

$ echo 'word_boundary' | grep -o '\<\w*\>'
word_boundary

$ echo 'word(bound)ary' | grep -o '\<\w*\>'
word
bound
ary

有关详细信息,请参阅正则表达式教程 - 单词边界

答案2

如果要搜索精确的单词,则需要使用选项 -w。请参阅以下命令:

grep -w "hello ab" file.txt

输出正如你所期望的。

hello ab

如果您想要确切的名称“hello ab”,那么请在 grep 命令中使用 -w 选项。

如果想了解 grep 命令的更多选项,可以参考我写的 grep 命令的文章:https://screwlinux.com/how-to-use-grep-command-in-linux/

相关内容