在macOS终端通过Shell提取文件中的UUID格式作业ID
解决方法
你的正则表达式本身是正确的,但问题出在Shell工具的正则模式和输出选项上,以下是几种可行的解决方案:
方案1:使用grep扩展正则(推荐)
grep默认使用基础正则表达式(BRE),{}这类量词需要转义,而你的正则是扩展正则语法,因此需要加上-E启用扩展正则,同时用-o只输出匹配的ID部分:
JOB_ID=$(grep -Eo '[\da-f]{8}(-[\da-f]{4}){3}-[\da-f]{12}' file)
-E:启用扩展正则表达式,无需转义{}和括号-o:仅输出匹配的字符串,而非整行内容
方案2:使用grep基础正则写法
如果不想用扩展正则,需要转义{}和括号,同时可以用POSIX标准的[[:xdigit:]]代替[\da-f](匹配十六进制字符):
JOB_ID=$(grep -o '[[:xdigit:]]\{8\}-\([[:xdigit:]]\{4\}-\)\{3\}[[:xdigit:]]\{12\}' file)
方案3:使用sed提取
sed通过替换命令捕获并提取ID:
JOB_ID=$(sed -n 's/.*\([[:xdigit:]]\{8\}-\([[:xdigit:]]\{4\}-\)\{3\}[[:xdigit:]]\{12\}\).*/\1/p' file)
-n:禁止默认输出所有行s/.*(匹配内容).*/\1/p:将整行替换为捕获的ID,并打印该行
方案4:使用awk提取
awk支持扩展正则,可以直接匹配并提取:
JOB_ID=$(awk '/[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}/ {match($0, /[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}/); print substr($0, RSTART, RLENGTH)}' file)
或者用更简洁的FPAT指定字段匹配规则:
JOB_ID=$(awk -v FPAT='[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}' '{print $1}' file)
为什么之前的命令失败?
- 未使用
-o选项:默认grep会输出整行匹配内容,而非单独的ID - 未启用扩展正则:默认grep的基础正则不支持
{8}这种未转义的量词语法,导致正则无法匹配
内容的提问来源于stack exchange,提问作者lazarevzubov
相关产品推荐
相关产品推荐

