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/