2016-05-16 49 views
1

我試圖比較兩個yml文件,並使用shell腳本根據某些條件刪除塊。我正在使用此YML解析器,https://gist.github.com/pkuczynski/8665367用於比較yml文件。但是我很難從他們身上移除這個塊。例如,如何在shell腳本中從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,但是我並不確切地知道,因爲它含有一些涉及多條線路的複雜情況。

任何幫助或建議,這將是非常有益的,非常感謝。

回答

1

您可以使用此awk命令:

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

說明:

  • 設置t=1當我們遇到tool:作爲第一列
  • t==1,使t=2當我們遇到第一列在ports:
  • 重置爲t=0t==2,我們得到了與:
  • 打印時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" 
+0

嗨,感謝您的回答。如果你對這個作品給出一個小的解釋,那將是很棒的。它也是去除像子塊(比如音量)或主塊(比如tool1)之後的任何東西,或者之後出現的任何東西。 – Stranger

+0

它只刪除以'ports:'開頭的子塊,它位於主工具下:'塊。請參閱編輯答案以獲取解釋 – anubhava

+1

太棒了!謝謝你的精彩回答。 – Stranger