2016-05-16 21 views
1

私は、次のコマンドを使用して、YMLファイルからブロックを削除しようとしている、以下のYMLのためUbuntuのバッシュawkの異常な動作

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

コンソールセッションの画像は含めないでください。 *テキスト*をコピーしてあなたの質問に貼り付けてください。 – 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 ++;次の} t == 2 &&/* $/{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などを使用することを検討してください。他のユーティリティで他の問題が発生する可能性があります。

関連する問題