grep --only-matching 功能异常求助:匹配height=xxx结果不符合预期
解决macOS下grep --only-matching匹配异常的问题
嘿,我之前在macOS上也踩过这个坑!你提到用grep --only-matching(也就是-o选项)匹配height=xxx结果异常,核心原因其实是macOS自带的grep是BSD版本,不是你以为的GNU grep——虽然你的bash是GNU的,但系统里的grep是BSD实现,它的正则语法和-o行为跟GNU grep有不少差异。下面给你拆解可能的原因和解决办法:
最常见的两个坑
- 正则语法不兼容:BSD grep默认用的是基本正则表达式(BRE),像
+这种表示“一个或多个”的元字符,在BRE里是普通字符,必须转义成\+才能生效。如果你直接写height=[0-9]+,它只会匹配height=后面跟一个数字加+的情况,自然结果不对。 - 捕获组导致的输出拆分:如果你的正则带括号捕获组(比如
height=([0-9]+)),BSD grep的-o选项只会输出捕获组里的内容,而不是整个匹配的字符串。这就会出现只拿到数字、看不到height=的异常结果。
快速解决办法
办法1:调整正则适配BSD grep
如果你不想额外安装工具,直接改正则写法就行:
- 用基本正则(默认):把
+转义,命令写成:grep -o 'height=[0-9]\+' 你的文件名 - 或者启用扩展正则(推荐,写法更直观):加
-E选项,不用转义+:grep -Eo 'height=[0-9]+' 你的文件名
办法2:安装GNU grep(彻底解决差异问题)
如果经常用GNU工具的语法,推荐用Homebrew安装GNU版本的grep:
brew install grep
安装后,用ggrep命令代替grep,这样就能完全按照GNU grep的逻辑来执行,比如直接写:
ggrep -o 'height=[0-9]+' 你的文件名
就和Linux上的结果一致了。
额外排查点
如果上面的方法还是不对,建议用cat -A 你的文件名查看输入内容里有没有隐藏的非打印字符(比如换行符、制表符),有时候这些隐藏字符会干扰正则匹配,导致结果看起来异常。
内容的提问来源于stack exchange,提问作者BigJoe
相关产品推荐
相关产品推荐

