正则表达式如何匹配指定字符或行尾?实现路径分段提取
路径分段提取实现方案
需求说明
需要对输入的存储路径做两段拆分,输入路径格式包含以下类型:
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
相关产品推荐
相关产品推荐

