如何匹配terraform-*、tfRepo-*通配符前缀后截取剩余目录路径
可行实现方案
方案1:sed 实现(兼容性最好)
使用扩展正则匹配,替换掉从路径开头到匹配前缀段后第一个斜杠的所有内容:
# 测试用例1:terraform-前缀 echo /Users/user/Documents/terraform-shared-infra/services/history_book_test | sed -E 's|.*(terraform-|tfRepo-)[^/]+/||' # 测试用例2:tfRepo-前缀 echo /Users/user/Documents/tfRepo-shared-infra/services/history_book_test | sed -E 's|.*(terraform-|tfRepo-)[^/]+/||'
输出结果:
services/history_book_test services/history_book_test
原sed写法问题说明
之前的sed逻辑只捕获了前缀段中terraform-到第一个斜杠的内容(即shared-infra),且丢弃了后续路径,所以不符合需求。
方案2:grep 实现(需支持PCRE正则)
利用\K语法丢弃前缀匹配内容,只输出后续路径:
echo /Users/user/Documents/terraform-shared-infra/services/history_book_test | grep -oP '(terraform-|tfRepo-)[^/]+/\K.*'
方案3:awk 实现(逻辑更灵活)
将路径按斜杠拆分后定位匹配的目录段,再拼接后续路径:
echo /Users/user/Documents/terraform-shared-infra/services/history_book_test | awk '{ split($0, path_arr, "/") for (i in path_arr) { if (path_arr[i] ~ /^(terraform-|tfRepo-)/) { start_idx = i + 1 break } } for (j = start_idx; j <= length(path_arr); j++) { printf "%s%s", path_arr[j], (j == length(path_arr) ? "\n" : "/") } }'
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

