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"
的目标是去除ports
从tool
主块的子块。 从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
在这个特殊的情况下,任何帮助将是真正伟大的。
答
我在前面的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
匹配的空格。
答
如果该文件是在Windows中创建并因此具有窗口的行结尾(CR-LF),则图案/:[[:blank:]]*$/
将失败
[[:blank:]]
只匹配制表符和空格。要匹配任何空白字符,包括\r
(回车),请使用[[:space:]]
。
如果事实证明是问题所在,请考虑使用dos2unix
或类似命令来删除不正确的行结束符,因为它们会导致其他实用程序出现其他问题。
请不要包含控制台会话的图像。将*文本*复制并粘贴到您的问题中。 – rici
您使用的是什么版本的awk?不是所有的支持字符类('[[:blank:]]')都试试'[\ t]'。 –