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对待-呢?
该-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。