2017-12-19 7 views
0

Hier ist mein Inhalt yaml DateiAttribut in Submodus von yaml Dateiinhalt von sed Befehl

web: 
    image: apache 
    volumes: 
     - "./app:/src/app" 
    ports: 
     # - add ports here 

Ich brauche ein Attribut als type unter web hinzuzufügen.
Erwartete Ausgabe:

web: 
    image: apache 
    volumes: 
     - "./app:/src/app" 
    ports: 
     # - add ports here 
    type: none 

Wie können wir dies erreichen durch die Verwendung od sed Befehl zu machen. Ich versuchte oft mit sed -r 's/^web (type\s*:\s*\s*$)/\1type: none/' file_name diesen Befehl, aber es muss type bereits in Daten vorhanden sein. Aber muss ich Daten neues Attribut hinzufügen unter web

+1

'sed' ist kein besonders gut ausgewähltes Werkzeug für den Job; Insbesondere für eine Syntax, die so komplex ist wie YAMLs, funktioniert jeder Code, der versucht, mit sed zu editieren, nur mit einer sehr begrenzten Teilmenge der verfügbaren Syntax der Sprache korrekt. Ich würde sehr empfehlen, den Inhalt in JSON zu speichern (JSON ist eine Teilmenge von YAML) und 'jq' für Bearbeitungen zu verwenden oder eine Sprache mit YAML-Bibliotheken (wie Python oder Ruby) für den Job aufzurufen. –

+0

ich versuchte 'jq' aber es wird dann das Format ändern .. @ CharlesDuffy – Miracle

+0

Ja, es wird - aber es wird immer noch syntaktisch identisch sein. Darf ich Ihnen zwei verschiedene Kopien Ihrer Datei vorschlagen, von denen eine für die menschliche Erzeugung (und nur von Menschen * modifiziert *) und eine in maschinenlesbarer Form strukturiert ist? –

Antwort

0

Das ist nicht wirklich eine saubere Lösung, aber wenn der Kommentar

# - add ports here 

bleibt so, können Sie einfach fügen Sie nach dieser Zeile:

sed -i '/# - add ports here/a \ \ \ type: none' your_file 

Dies wird auch die richtige Anzahl von Leerzeichen hinzufügen.

+0

Ports Wert könnte jeder sein, wie wir hardcoded @NullDev nehmen können – Miracle