2016-05-16 73 views
1

我嘗試使用下面的命令來刪除從YML文件塊,Ubuntu的慶典awk的古怪行爲

awk '$1 == "tool:"{t=1} 
    t==1 && $1 == "ports:"{t++; next} 
    t==2 && /:[[:blank:]]*$/{t=0} 
    t != 2' file.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" 

的目標是去除portstool主塊的子塊。 從https://stackoverflow.com/a/37256824/698072這個答案似乎是完全有效的,當嘗試here。但它正在從端口刪除一切,直到我的Ubuntu 14.04中的yml文件結束(在14.04的多個系統中都在sh和zsh中嘗試過)。

預計:

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: 
    image: tool.xxx.com/platform/app:dev 
    log_driver: syslog 
    restart: always 

在這個特殊的情況下,任何幫助將是真正偉大的。

+2

請不要包含控制檯會話的圖像。將*文本*複製並粘貼到您的問題中。 – rici

+1

您使用的是什麼版本的awk?不是所有的支持字符類('[[:blank:]]')都試試'[\ t]'。 –

回答

0

我在前面的awk命令中做了一些更改,以便注意您的yml具有DOS行結束的可能性。

awk '{sub(/\r$/, "")} 
    $1 == "tool:"{t=1} 
    t==1 && $1 == "ports:"{t++; next} 
    t==2 && /:\s*$/{t=0} 
    t != 2' file.yml 

看起來像Ubuntu awk不支持POSIX類[[:blank:]][[:space:]],所以我們需要使用\s匹配的空格。

+1

這正好,'echo「$(cat docker-compose.yml)」| awk'$ 1 ==「tool:」{t = 1} t == 1 && $ 1 ==「ports:」{t ++; next} t == 2 &&/s * $/{t = 0} t!= 2''。感謝您的寶貴時間,並對此感到抱歉。 – Stranger

+0

您在Ubuntu上安裝了哪個版本的awk? gawk絕對支持posix類。 – rici

+0

是的gnu awk甚至BSD awk絕對支持POSIX類。看起來我的Ubuntu與'mawk 1.3.3'一起發貨。 – anubhava

0

如果該文件是在Windows中創建並因此具有窗口的行結尾(CR-LF),則圖案/:[[:blank:]]*$/將失敗

[[:blank:]]只匹配製表符和空格。要匹配任何空白字符,包括\r(回車),請使用[[:space:]]

如果事實證明是問題所在,請考慮使用dos2unix或類似命令來刪除不正確的行結束符,因爲它們會導致其他實用程序出現其他問題。