Regex sh/sed从docker compose卷覆盖文件中删除行

Regex sh/sed从docker compose卷覆盖文件中删除行,regex,sed,docker-compose,sh,Regex,Sed,Docker Compose,Sh,docker compose允许覆盖文件,但是如果在第一个文件中指定了卷,例如volA,并且在覆盖volB中指定了卷,则最终结果将是volA和volB 我需要编写一个脚本来搜索和删除初始docker compose文件中的所有卷。 此docker compose.yaml: version: '2' services: first-container: image: 'alpine' ports: - '5000' volumes: - './

docker compose允许覆盖文件,但是如果在第一个文件中指定了卷,例如
volA
,并且在覆盖
volB
中指定了卷,则最终结果将是
volA
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'

注释中要求的解释:每次输入行不是以
-
开头时,如果行上的第一个字段是
卷:
0
(false),则我们将变量
inVol
设置为
1
(true)。然后,对于每一行,我们只需检查
inVol
,如果它是真的(即,我们正在处理以
volume:
开头的行,或者在下一行之前以
-
开头的后续行,而下一行不是以
-
开头的行),那么
!inVol
为false,因此我们什么也不做,但如果inVol为false(即我们不在
卷:
块中),则
!inVol
为true,因此我们在给定true条件的情况下调用默认操作,即打印当前行。

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'

注释中要求的解释:每次输入行不是以
-
开头时,如果行上的第一个字段是
卷:
0
(false),则我们将变量
inVol
设置为
1
(true)。然后,对于每一行,我们只需检查
inVol
,如果它是真的(即,我们正在处理以
volume:
开头的行,或者在下一行之前以
-
开头的后续行,而下一行不是以
-
开头的行),那么
!inVol
为false,因此我们什么也不做,但如果inVol为false(即我们不在
卷:
块中),则
!inVol
为真,因此,如果条件为真,我们将调用默认操作,即打印当前行。

OMG,这非常有用!!你能帮我理解这是怎么回事吗?我会非常感激的!我在回答中添加了一个解释。谢谢你,Ed,这非常有帮助!天哪,这太有帮助了!!你能帮我理解这是怎么回事吗?我会非常感激的!我在回答中添加了一个解释。谢谢你,Ed,这非常有帮助!