如何修复sed脚本,从Git SSH地址提取组织名与仓库名?
解决sed报错并提取Git SSH地址中的组织与仓库名
错误根源
你第二个sed命令里同时用/作为正则匹配字符和s命令的分隔符,sed会把正则里的/误判为s命令的结束标记,后面的内容被当成无效选项,所以抛出sed: -e expression #1, char 39: unknown option to s错误。
修复后的sed脚本
方案1:统一用#作为s命令分隔符
和第一个脚本保持一致,用#替代/作为s命令的分隔符,这样正则里的/就不会干扰sed解析:
SSH_URL="git@github.com:myOrg/my-repo.git" # 提取组织名 myOrg GIT_ORG=$(echo "$SSH_URL" | sed -n 's#^.*:\([^/]*\)/\(.*\)\.git$#\1#p') # 提取仓库名 my-repo REPO=$(echo "$SSH_URL" | sed -n 's#^.*:\([^/]*\)/\(.*\)\.git$#\2#p') # 验证输出 echo "组织名:$GIT_ORG" echo "仓库名:$REPO"
方案2:转义正则中的/
如果坚持用默认的/作为分隔符,需要把正则里的/转义成\/,让sed识别为普通字符:
SSH_URL="git@github.com:myOrg/my-repo.git" GIT_ORG=$(echo "$SSH_URL" | sed -n 's/^.*:\([^\/]*\)\/\(.*\)\.git$/\1/p') REPO=$(echo "$SSH_URL" | sed -n 's/^.*:\([^\/]*\)\/\(.*\)\.git$/\2/p')
更省心的替代方案:用awk处理
awk的字段分割功能更直观,不用纠结分隔符冲突问题:
SSH_URL="git@github.com:myOrg/my-repo.git" # 以:和/作为分割符,取第4个字段为组织名 GIT_ORG=$(echo "$SSH_URL" | awk -F'[:/]' '{print $4}') # 以:、/、.作为分割符,取第5个字段为仓库名 REPO=$(echo "$SSH_URL" | awk -F'[:/.]' '{print $5}')
内容的提问来源于stack exchange,提问作者Karthik Peddineni
相关产品推荐
相关产品推荐

