Bash 如何在shell脚本中从YML中删除子块?

Bash 如何在shell脚本中从YML中删除子块?,bash,shell,awk,sed,grep,Bash,Shell,Awk,Sed,Grep,我试图比较两个yml文件,并使用shell脚本根据某些条件删除一个块。我使用这个YML解析器来比较YML文件。但我真的为从他们身上移开障碍而奋斗了很多。比如说, tool: image: tool.xxx.com/platform/app:dev log_driver: syslog restart: always ports: - "54325:80" - "543325:80" volume: - "a:b" tool1: image: to

我试图比较两个
yml
文件,并使用shell脚本根据某些条件删除一个块。我使用这个
YML
解析器来比较
YML
文件。但我真的为从他们身上移开障碍而奋斗了很多。比如说,

tool:
  image: tool.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  ports:
    - "54325:80"
    - "543325:80"
  volume:
    - "a:b"

tool1:
  image: tool1.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  ports:
    - "54325:80"
    - "543325:80"
  volume:
    - "a:b"
如何删除
工具下的端口块
并使输出类似

tool:
  image: tool.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  volume:
    - "a:b"

tool1:
  image: tool1.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  ports:
    - "54325:80"
    - "543325:80"
  volume:
    - "a:b"
我尝试了一些使用awk和sed的方法,但我不太清楚,因为它包含一些涉及多行的复杂条件


在此方面的任何帮助或建议都将非常有用,我们将不胜感激。

您可以使用此awk命令:

awk '$1 == "tool:"{t=1}
   t==1 && $1 == "ports:"{t++; next}
   t==2 && /:[[:blank:]]*$/{t=0}
   t != 2' file.yml
说明:

tool:
  image: tool.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  volume:
    - "a:b"

tool1:
  image: tool1.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  ports:
    - "54325:80"
    - "543325:80"
  volume:
    - "a:b"
  • 当我们遇到
    tool:
    时,将
    t=1设置为第一列
  • t==1
    时,当我们在
    端口中遇到第一列时,使
    t=2
  • t==2
    时,重置为
    t=0
    ,我们得到一行以
    结尾的代码:
  • t!=2
    (表示我们不在
    工具->端口:
    部分)
输出:

tool:
  image: tool.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  volume:
    - "a:b"

tool1:
  image: tool1.xxx.com/platform/app:dev
  log_driver: syslog
  restart: always
  ports:
    - "54325:80"
    - "543325:80"
  volume:
    - "a:b"

嗨,谢谢你的回答。如果你能对这部作品做一个小小的解释,那就太好了。此外,它还删除端口后面的所有内容,如子块(如卷)或主块(如tool1)或之后的任何内容。它只删除主
工具:
块下以
端口:
开头的子块。请参阅编辑后的答案以了解解释。不确定原因,但我在我的Ubuntu shell中得到了这个输出(在多个系统中使用
zsh
bash
),这里有相同的代码。有什么线索吗?我知道它是有效的(即使是在我之前的评论中发布的tutorialspoint链接中)。我只是想知道为什么它不能在Ubuntu shell中工作(在2个系统中的sh和zsh中都试过了)。嗯,不确定,因为它甚至不需要gnu awk。我已经在OSX和Ubuntu上进行了测试,它在这两个系统上都能工作。