regex - sh/sed 从文件中删除行以进行 docker-compose 卷覆盖
问题描述
docker-compose 允许覆盖文件,但是如果在第一个文件中指定了卷,例如volA
,并且在覆盖中指定了卷volB
,则最终结果将是volA
and volB
。
我需要编写一个脚本来搜索和删除初始 docker-compose 文件中的所有卷。
这docker-compose.yaml
:
version: '2'
services:
first-container:
image: 'alpine'
ports:
- '5000'
volumes:
- './volA:/etc/volA'
- './volB:/etc/volB'
second-container:
image: 'alpine'
ports:
- '5000'
volumes:
- './volC:/etc/volC'
- './volD:/etc/volD'
运行script
使docker-compose.yaml
文件变为:
version: '2'
services:
first-container:
image: 'alpine'
ports:
- '5000'
second-container:
image: 'alpine'
ports:
- '5000'
我知道我必须按照这个思路做一些事情,但我不太确定如何做。
sed -i '/volume:/d' '' ./docker-compose.yaml
解决方案
sed 用于做 s/old/new,仅此而已。对于其他任何事情,请使用 awk:
$ awk '$1!="-"{inVol=($1=="volumes:")} !inVol' file
version: '2'
services:
first-container:
image: 'alpine'
ports:
- '5000'
second-container:
image: 'alpine'
ports:
- '5000'
注释中要求的解释:每次输入行不以-
我们设置一个变量inVol
为1
(true),如果该行的第一个字段是volumes:
,否则为0
(false)。然后对于每一行,我们只检查inVol
它是否为真(即我们正在处理以开头的行volume:
或-
在下一行之前开始的后续行,而不是以 开头-
)然后!inVol
是假的,所以我们什么也不做,但是如果inVol
为假(即我们不在volume:
块中)!inVol
则为真,因此我们调用默认操作给定一个真条件,即打印当前行。
推荐阅读
- json - JSON解析器允许字符串中的换行符?
- python - Python - 如何四舍五入到指定的小数
- python - 如果多个实例处于活动状态,Python 子进程命令不会等待
- spring-batch - 我的弹簧批处理步骤在达到构建后一直循环
- python - 通知时未从喙回调中获取所有字节
- oracle11g - sqldeveloper 打不开
- c++ - regex_match 无法将字符串与特殊的正则表达式字符串匹配
- python - 如何使用 pandas .apply() 方法更改列值
- typescript - 根据另一个 Typescript 的属性约束一个 Typescript 通用参数?
- bash - 如何禁用 devtoolset-8?