在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
相关产品推荐
相关产品推荐

