2017-09-13 53 views
1

我必須更新YAML文件配置。以下是當前和預期的產出。我怎樣才能以更好,最簡單的方式使用shell腳本?在Ubuntu中使用shell腳本更新YAML文件

的YAML文件的更新之前:

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 
# engine: 
# mmapv1: 
# wiredTiger: 

YAML文件的更新後:

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 
    engine: "wiredTiger" 
# mmapv1: 
    wiredTiger: 
    engineConfig: 
     cacheSizeGB: 4 
+1

你應該總是使用一個解析器來做這種更新,使用不知道YAML內部的shell腳本(調用'sed'或'awk')在某個時刻保證會中斷。 (在引號,摺疊的線條,評論,塊vs流風格等) – Anthon

+1

與@Anthon在那裏達成一致。我的意思是「它只是文本」,所以你可以做任何你想做的事情。但它實際上是一個「序列化的數據結構」,因此,根據需求解析和修改數據結構並將其重新輸出爲YAML格式非常有意義。它幾乎已經過時,因爲即使CSV也可以非常簡單,但破解它也非常簡單。數據結構通常最好留給理解它們的東西。 IHMO, –

+0

作爲旁註,您的「編輯」實際上非常通用。所以似乎沒有任何理由說明爲什麼你不能換出新的現有配置。除非有問題中沒有提到的某些實例特定數據,否則 –

回答

1

如果輸入是在config_in.yaml

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 

您可以致電python update.py wiredTiger 4update.py

import sys 
from pathlib import Path 

from ruamel.yaml import YAML 

file_name = Path('config_in.yaml') 

engine = sys.argv[1] 
size = int(sys.argv[2]) 


yaml = YAML() 
data = yaml.load(file_name) 
data['storage']['engine'] = engine 
data['storage'][engine] = dict(engineConfig=dict(cacheSizeGB=size)) 
yaml.dump(data, sys.stdout) 
yaml.dump(data, Path('config.yaml')) 

(在config.yaml在標準輸出以及),以獲得該輸出:

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 
    engine: wiredTiger 
    wiredTiger: 
    engineConfig: 
     cacheSizeGB: 4 

這是假設Python3(或Python2與pathlib2安裝),以及ruamel.yaml(其中我的作者)

+0

引擎:輸出中缺少「wiredTiger」。我也不想要這條線「#wiredTiger:」。這是執行腳本後的輸出。 #在哪裏以及如何存儲數據。 存儲: DBPATH:在/ var/lib中/ MongoDB的 雜誌: 啓用:真 wiredTiger: engineConfig: cacheSizeGB:4 #引擎: #mmapv1: #wiredTiger: – karan

+0

我更新腳本。它**可以刪除註釋,但不像在我提交的輸入中那樣容易。特別是因爲多條評論欄被假定爲一個評論欄。 – Anthon

+0

好的。謝謝。它的工作。 – karan