Ubuntu bash awk奇怪的行为

时间:2016-05-16 17:19:15

标签: linux bash ubuntu awk

我尝试使用以下命令

从yml文件中删除块
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"

目标是从ports主块中删除tool子块。 在尝试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 个答案:

答案 0 :(得分:0)

如果文件是在Windows上创建的,因此具有Windows行结尾(CR-LF),则模式 public Dialog onCreateDialog(Bundle savedInstanceState) { inflater = getActivity().getLayoutInflater(); v = inflater.inflate(R.layout.call, null); Button annuleren = (Button) v.findViewById(R.id.annuleren); //here is the problem I assume annuleren.setOnClickListener(this); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(v); return builder.create(); } 将失败

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

如果结果是问题,请考虑使用[[:space:]]或类似方法删除错误的行结尾,因为它们会导致其他实用程序出现其他问题。

答案 1 :(得分: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来匹配空格。