2016-05-16 32 views
1

Ich versuche, einen Block von yml Datei mit dem folgenden Befehl zu entfernen,Ubuntu bash awk merkwürdiges Verhalten

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

für folgende 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" 

Das Ziel ist es, die ports zu entfernen Unterblock aus dem tool Hauptblock. Diese Antwort von https://stackoverflow.com/a/37256824/698072 scheint perfekt zu sein, wenn sie ausprobiert wurde here. Aber es ist alles direkt von den Ports bis zum Ende der Yml-Datei in meinem Ubuntu 14.04 zu entfernen (versucht in sh und zsh in mehreren Systemen von 14.04).

Erwartet:

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" 

Ausgang:

tool: 
    image: tool.xxx.com/platform/app:dev 
    log_driver: syslog 
    restart: always 

Jede Hilfe zu diesem eigenartigen Fall wäre wirklich toll.

+2

Bitte keine Bilder von Konsolensitzungen hinzufügen. Kopieren Sie den * Text * und fügen Sie ihn in Ihre Frage ein. – rici

+1

Welche Version von awk verwenden Sie? Nicht alle Unterstützungszeichenklassen ('[[:: leer:]]') versuchen Sie stattdessen '[\ t]'. –

Antwort

0

Ich habe einige Änderungen in meinem früheren awk Befehl vorgenommen, um auf die Möglichkeit zu achten, dass Ihre yml DOS-Zeilenenden hat.

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

Sieht aus wie Ubuntu awk POSIX-Klassen [[:blank:]] oder [[:space:]] nicht so unterstützen wir \s verwenden müssen, werden weiß-Räume passen.

+1

Dies funktionierte genau, "echo" $ (cat docker-compose.yml) " awk '$ 1 == "tool:" {t = 1} t == 1 && $ 1 == "ports:" {t ++; nächste} t == 2 &&/s * $/{t = 0} t! = 2''. Danke für deine wertvolle Zeit und Entschuldigung für die Verwirrung. – Stranger

+0

Welche Version von awk hast du auf deinem Ubuntu? gawk unterstützt definitiv die Posix-Klassen. – rici

+0

Ja gnu awk oder sogar BSD awk unterstützen definitiv POSIX-Klassen. Es scheint, dass mein Ubuntu mit 'mawk 1.3.3' ausgeliefert wurde. – anubhava

0

Wenn die Datei auf Fenster erstellt wurde und deshalb hat Fenster Zeilenende (CR-LF), dann das Muster /:[[:blank:]]*$/ fehl

[[:blank:]] nur Tabs und Leerzeichen übereinstimmt. Verwenden Sie [[:space:]], um beliebiges Leerzeichen, einschließlich \r (Wagenrücklauf) zu entsprechen.

Wenn sich herausstellt, dass das Problem besteht, ziehen Sie in Betracht, dos2unix oder ähnliches zu verwenden, um die falschen Zeilenenden zu entfernen, da sie andere Probleme mit anderen Dienstprogrammen verursachen.

Verwandte Themen