为什么“grep -w”匹配后面带有连字符/减号(“-”)的单词?

SED*_*D85 1 grep regular-expression pattern-matching

我需要询问您有关grep在 Debian 中的 Bash 脚本中使用命令的问题。

我有包含以下几行的示例文件:

/fruit-/apple.txt
/fruit-/banana.txt
/fruit-/samples
/vegetables-/carrot.txt
/vegetables-/garlic.txt
Run Code Online (Sandbox Code Playgroud)

我想选择包含 word 的所有行fruit-

我可以调用命令:

grep -w "fruit-" file.txt
Run Code Online (Sandbox Code Playgroud)

输出将是:

/fruit-/apple.txt
/fruit-/banana.txt
/fruit-/samples
Run Code Online (Sandbox Code Playgroud)

但是当我使用命令时:

grep -w "fruit" file.txt
Run Code Online (Sandbox Code Playgroud)

我也得到与上面相同的输出。但这是错误的。输出应该是 0。因为我没有输入-模式。

为什么不正确grep对待-呢?

Adm*_*Bee 6

-w选项确实告诉grep只查找fruit与“单词”匹配的行,这意味着它必须从行的开头开始,或者前面有“非单词”字符,并且在行的末尾结束或后跟“非单词”字符。

但是,根据手册页,“单词”字符grep是:

单词组成字符是字母、数字和下划线。

这意味着-是一个“非单词”字符,并且fruit-将匹配“单词搜索”,因为fruit匹配算法将在到达 时停止-

现在,您似乎只想选择前两行之间的内容/ 恰好是 的 fruit那些行,而不是包含模式 fruit。在这些情况下,您必须使匹配更加明确:

  • 使用grep,您可以说:
    grep "^/fruit/" file.txt
    
    Run Code Online (Sandbox Code Playgroud) 这会将模式锚定到行的开头,并且仅接受-后没有的那些行fruit
  • 或者,将awk集合/用作字段分隔符:
    awk -F/ '!$1&&$2=="fruit"' file.txt
    
    Run Code Online (Sandbox Code Playgroud) 这将只接受第一个字段为空(即以 a 开头/)且第二个字段恰好为 的行fruit