bash - 使用bash脚本更新文件内容

标签 bash docker sed grep docker-compose

我有一个docker-compose文件,其中有一个带有版本标记的docker图像,例如myrepo.com/myimage:1.0.1.0。我想编写一个bash脚本,该脚本接收版本号作为参数并更新相关图像的版本标签。

目前,我正在使用以下命令在grepsed的帮助下替换版本标记,但我认为应该有一种更有效的方法。有什么建议么?

sedval='1.1.1.1'  # <-- new value

imageval=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml | cut -d ':' -f2,3)
imagename=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml | cut -d ':' -f2)
imageversion=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml | cut -d ':' -f3)
sed -i -e "s+$imageval+$imagename:$sedval+g" docker-compose.yml

最佳答案

通常不建议使用面向行的正则表达式工具来操作YAML。为此,您可能应该切换到支持YAML的工具,例如yq

似乎没有理由提取imageversion;您分配了此变量,但从不使用它。实际上,如果您放弃区分大小写的匹配要求,那么您真正需要的就是

sed -i "s+\\(image: myrepo\\.com/myimage:\\)[.0-9]*+\\1$1+" docker-compose.yml

假设(就像您在问题中说的那样)新版本号位于$1中,这是脚本的第一个命令行参数。

我不认为Docker允许您使用大写字母。如果可以,则可以将i替换为[Ii],将m替换为[Mm],等等。请注意,严格来说,还需要对文字点进行反斜杠转义。

一般来说,您通常可以将grep 'x' | sed 'y'替换为sed '/x/y';另请参阅useless use of grep .另外,重复的grep可以很容易地重新修饰成单个grep,例如
imageval=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml)
imagever=${imageval##*:}
imagename=${imageval%:$imagever}

在此非常简单的字符串提取任务中,与在单独的过程中反复生成cut相比,shell参数替换既简单又优雅,并且效率更高。

关于bash - 使用bash脚本更新文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59190198/

相关文章:

linux - 删除不区分大小写的文件

arrays - 检查元素是否存在于 Bash 数组中

sed - sed实用程序中的 'd'命令

linux - 脚本有随机 'Operation Not Permitted' 错误

linux - 如何在没有镜头的情况下使用 augtool?

javascript - 如何通过我的应用程序代码(即 NodeJS)将 cronjob 条目动态添加到基于 ubuntu 的容器中?

docker - 具有docker run的docker mediawiki localsettings

python - standard_init_linux.go :211: exec user process caused "exec format error"

c++ - 使用 sed 将文本文件转换为 C 字符串

内存中的python gzip文件并上传到s3