gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:04:01 24 4
gpt4 key购买 nike

我有一个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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com