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

正则表达式如何匹配指定字符或行尾?实现路径分段提取

路径分段提取实现方案

需求说明

需要对输入的存储路径做两段拆分,输入路径格式包含以下类型:

bucket
bucket/dir1
bucket/dir1/dir2
bucket/dir1/dir2/dir3
...

拆分规则:

  • 第一部分为路径首个斜杠前的内容(即bucket),存入独立变量
  • 第二部分为首个斜杠后的所有剩余路径内容(即dir1/dir2/dir3/...),存入另一个独立变量
  • 当输入仅为bucket无后续斜杠和路径时,第二部分变量需赋值为空字符串""

原有方案问题

原有sed实现仅在路径包含斜杠时正常生效:

❯ BUCKET=$(echo "bucket/dir1/dir2" | sed 's@\(^[^\/]*\)[\/]\(.*\)@\1@')
❯ EXTENS=$(echo "bucket/dir1/dir2" | sed 's@\(^[^\/]*\)[\/]\(.*\)@\2@')
❯ echo $BUCKET $EXTENS
bucket dir1/dir2

无斜杠场景下正则匹配失败,替换逻辑不触发,导致第二部分变量错误返回原路径值:

❯ BUCKET=$(echo "bucket" | sed 's@\(^[^\/]*\)[\/]\(.*\)@\1@')
❯ EXTENS=$(echo "bucket" | sed 's@\(^[^\/]*\)[\/]\(.*\)@\2@')
❯ echo $BUCKET $EXTENS
bucket bucket

可行实现方案

方案1:修正sed正则匹配规则

调整正则表达式,将斜杠标记为可选匹配,兼容无斜杠场景,需要加-r参数启用扩展正则支持:

# 替换原有的sed匹配逻辑即可
BUCKET=$(echo "$path" | sed -r 's@^([^/]*)/?(.*)@\1@')
EXTENS=$(echo "$path" | sed -r 's@^([^/]*)/?(.*)@\2@')

效果验证:

# 无斜杠场景
❯ path="bucket"
❯ BUCKET=$(echo "$path" | sed -r 's@^([^/]*)/?(.*)@\1@')
❯ EXTENS=$(echo "$path" | sed -r 's@^([^/]*)/?(.*)@\2@')
❯ echo "BUCKET=[$BUCKET], EXTENS=[$EXTENS]"
BUCKET=[bucket], EXTENS=[]

# 多层路径场景
❯ path="bucket/dir1/dir2/dir3"
❯ BUCKET=$(echo "$path" | sed -r 's@^([^/]*)/?(.*)@\1@')
❯ EXTENS=$(echo "$path" | sed -r 's@^([^/]*)/?(.*)@\2@')
❯ echo "BUCKET=[$BUCKET], EXTENS=[$EXTENS]"
BUCKET=[bucket], EXTENS=[dir1/dir2/dir3]

方案2:Shell内置参数展开实现(推荐)

无需调用sed等外部进程,直接使用bash原生字符串处理逻辑,性能更高,适合脚本批量处理场景:

# 先定义待处理路径变量path
BUCKET="${path%%/*}"
EXTENS="${path#"$BUCKET"}"
EXTENS="${EXTENS#/}"

效果验证:

# 无斜杠场景
❯ path="bucket"
❯ BUCKET="${path%%/*}"; EXTENS="${path#"$BUCKET"}"; EXTENS="${EXTENS#/}"
❯ echo "BUCKET=[$BUCKET], EXTENS=[$EXTENS]"
BUCKET=[bucket], EXTENS=[]

# 单层目录场景
❯ path="bucket/dir1"
❯ BUCKET="${path%%/*}"; EXTENS="${path#"$BUCKET"}"; EXTENS="${EXTENS#/}"
❯ echo "BUCKET=[$BUCKET], EXTENS=[$EXTENS]"
BUCKET=[bucket], EXTENS=[dir1]

# 多层目录场景
❯ path="bucket/dir1/dir2/dir3"
❯ BUCKET="${path%%/*}"; EXTENS="${path#"$BUCKET"}"; EXTENS="${EXTENS#/}"
❯ echo "BUCKET=[$BUCKET], EXTENS=[$EXTENS]"
BUCKET=[bucket], EXTENS=[dir1/dir2/dir3]

方案对比

  • 方案1改动量小,仅需调整原有sed命令的正则规则即可快速修复问题
  • 方案2无外部进程调用开销,执行效率更高,兼容所有POSIX标准Shell,稳定性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:51:26