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
。