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

在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)

为什么之前的命令失败?

  1. 未使用-o选项:默认grep会输出整行匹配内容,而非单独的ID
  2. 未启用扩展正则:默认grep的基础正则不支持{8}这种未转义的量词语法,导致正则无法匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:15:31