Ubuntu的庆典awk的古怪行为

问题描述:

我尝试使用下面的命令来删除从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://*.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]'。 –

我在前面的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

如果该文件是在Windows中创建并因此具有窗口的行结尾(CR-LF),则图案/:[[:blank:]]*$/将失败

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

如果事实证明是问题所在,请考虑使用dos2unix或类似命令来删除不正确的行结束符,因为它们会导致其他实用程序出现其他问题。