如何使用sed替换含多个/字符的字符串?构建服务器场景求助
解决sed替换含/字符串的问题
遇到这种替换内容里包含斜杠的情况其实不用头疼——sed默认用/作为分隔符,但我们可以换成其他非字母数字的分隔符,比如|、#或者@,只要前后保持一致就行,这样就不用把所有的/都转义成\/,避免混乱。
方法一:指定完整匹配替换
直接把分隔符换成|,写出完整的替换命令:
sed 's|FROM java_jre_8@sha256:92f22331226b9b3c43a15eeeb304dd7|FROM docker-registry.service.consul:5000/java_jre_8@sha256:92f22331226b9b3c43a15eeeb304dd7|g' your-dockerfile-path
如果要直接修改文件(原地编辑),加上-i参数:
# Linux环境 sed -i 's|FROM java_jre_8@sha256:92f22331226b9b3c43a15eeeb304dd7|FROM docker-registry.service.consul:5000/java_jre_8@sha256:92f22331226b9b3c43a15eeeb304dd7|g' Dockerfile # macOS环境(需要额外加空参数) sed -i '' 's|FROM java_jre_8@sha256:92f22331226b9b3c43a15eeeb304dd7|FROM docker-registry.service.consul:5000/java_jre_8@sha256:92f22331226b9b3c43a15eeeb304dd7|g' Dockerfile
方法二:更灵活的匹配(适配sha256变化)
如果后续镜像的sha256值可能变动,我们可以用正则分组来匹配,不用写死完整的字符串:
sed 's|FROM \(java_jre_8@sha256:[a-f0-9]*\)|FROM docker-registry.service.consul:5000/\1|g' your-dockerfile-path
这里的\( \)是sed的分组语法,\1代表捕获到的第一个分组内容,这样不管sha256怎么变,只要是java_jre_8@sha256:开头的镜像,都会自动加上私有仓库前缀。
原理说明
sed的s命令格式是s/匹配内容/替换内容/标记,但这里的/只是默认分隔符,你可以换成任何不冲突的字符——比如当替换内容里有/时,用|就完全不会和内容里的斜杠混淆,写法更清晰,也不容易出错。
内容的提问来源于stack exchange,提问作者ecl0
相关产品推荐
相关产品推荐

