You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在macOS终端执行Bash脚本用正则时遇grep: invalid option -- P错误求解

解决macOS下grep -P选项无效的问题

问题原因

macOS自带的grep是BSD版本,不支持-P(Perl兼容正则)选项,这就是报错的根本原因。下面是几种无需额外安装工具的解决思路:


方案1:用BSD grep原生语法提取

BSD grep支持-E(扩展正则)选项,调整正则表达式匹配括号内容后,配合sed提取目标文本:

echo "device name, ID: (D96F7842-21D8-4E81-BAE6-DCF8EB66C734)" | grep -oE '\([^)]+\)' | sed 's/[()]//g'
  • -o:只输出匹配的部分
  • \([^)]+\):匹配从(开始到第一个)结束的内容([^)]表示非)的任意字符,避免贪婪匹配问题)
  • sed 's/[()]//g':去掉结果中的括号

方案2:用sed直接一步提取

不需要grep,直接用macOS自带的sed(支持扩展正则)完成提取:

echo "device name, ID: (D96F7842-21D8-4E81-BAE6-DCF8EB66C734)" | sed -E 's/.*\(([^)]+)\).*/\1/'
  • s/.*\(([^)]+)\).*/\1/:把整行替换成括号内的内容,\1引用第一个捕获组的内容

方案3:用awk按分隔符提取

利用awk把(和)作为分隔符,直接取第二部分内容:

echo "device name, ID: (D96F7842-21D8-4E81-BAE6-DCF8EB66C734)" | awk -F'[()]' '{print $2}'
  • -F'[()]':设置分隔符为(或)
  • $2:取分割后的第二个字段,也就是括号内的内容

方案4:安装GNU grep(可选)

如果坚持想用Perl正则,可以通过Homebrew安装GNU版本的grep(命名为ggrep):

brew install grep
ggrep -oP '\((.*?)\)' | sed 's/[()]//g'

内容的提问来源于stack exchange,提问作者Vladimir Amiorkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:42:29