macOS Bash中grep正则+量词失效、*生效的原因咨询
macOS Bash中grep的+量词失效问题解析
问题场景
在macOS的Bash环境执行npm ls -a,得到如下输出:
└─┬ cors@2.8.5 ├── object-assign@4.1.1 └── vary@1.1.2
尝试用命令npm ls -a | grep -o "\S+@\S+" >> deps.txt提取带版本的包名,但无任何结果;改用grep -o "\S*@\S*"却能正常得到目标内容。疑惑点在于:+匹配1个或多个非空白字符,理论上比匹配0或多个的*更严谨,为何反而失效?
原因与解决方法
核心问题在于macOS默认的grep是BSD版本,它默认使用基础正则表达式(BRE):
- 在BRE中,
+只是普通字符,不具备「匹配1个或多个」的量词功能,所以\S+@\S+根本匹配不到任何内容。 - 而
*是BRE原生支持的量词,所以\S*@\S*能正常工作。
要让+生效,有两种方法:
- 启用扩展正则表达式(ERE):添加
-E选项,命令修改为:npm ls -a | grep -oE "\S+@\S+" >> deps.txt - 转义
+:在BRE中转义后的\+会被识别为量词,命令修改为:npm ls -a | grep -o "\S\+@\S\+" >> deps.txt
这两种方式都能让你用更严谨的+量词实现需求。
内容的提问来源于stack exchange,提问作者UTKARSH TYAGI
相关产品推荐
相关产品推荐

