【问题标题】:How to remove a child block from YML in shell script?如何在 shell 脚本中从 YML 中删除子块?
【发布时间】:2016-05-16 14:31:59
【问题描述】:

我正在尝试比较两个 yml 文件并使用 shell 脚本根据某些条件删除一个块。我正在使用这个YML 解析器https://gist.github.com/pkuczynski/8665367 来比较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 下的端口块,这将使输出类似于,

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 尝试了一些东西,但我不知道确切的内容,因为它包含一些涉及多行的复杂条件。

对此的任何帮助或建议将非常有帮助并非常感谢。

【问题讨论】:

    标签: bash shell awk sed grep


    【解决方案1】:

    你可以使用这个 awk 命令:

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

    说明:

    • 当我们遇到tool: 时将t=1 设置为第一列
    • t==1 时,当我们遇到ports: 中的第一列时,生成t=2
    • t==2 时重置为t=0,我们得到一个以: 结尾的行
    • t != 2 时打印每一行(意味着我们不在tool: -> ports: 部分)

    输出:

    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"
    

    【讨论】:

    • 您好,感谢您的回答。如果你能对这部作品做一个小小的解释,那就太好了。它还删除了端口之后的所有内容,如子块(如音量)或主块(如工具 1)或之后出现的任何内容..
    • 它只删除以ports: 开头的子块,该子块位于主tool: 块之下。请参阅编辑后的答案以获取解释。
    • 不知道为什么,但我在我的 Ubuntu shell 中得到了这个作为输出 imgur.com/iLDeQsZ(在多个系统中尝试了 zshbash),这里有相同的代码,@987654322 @ .有什么线索吗?
    • 我知道它正在工作(即使在我之前评论中发布的教程点链接中)。我只是想知道为什么它在 Ubuntu shell 中不起作用(在 2 个系统中的 sh 和 zsh 中都试过)。
    • 嗯不确定,因为它甚至不需要 gnu awk。我已经在 OSX 和 Ubuntu 上对其进行了测试,并且可以在两个系统上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2021-03-27
    • 2021-04-19
    相关资源
    最近更新 更多