2014-10-29 80 views
0

我試圖從yml文件獲取配置值,但有一行具有相同的值,但註釋掉了。那就是:排除來自sed選擇的'#'評論

... 
    #database_name: prod 
    database_name: demo 
    database_user: root 
    database_password: password 
... 

我得到的所有值與此SED/AWK命令:現在

DATABASE_NAME=$(sed -n '/database_name/p' "$CONFIG_PATH" | awk -F' ' '{print $2}'); 

,如果我這樣做,我得到的用戶名和密碼正確的價值觀,但得到雙名。

的問題是:

如何排除從我的sed的選擇 '#' 評論?

+0

如果你解析YAML文件,那麼也許可以考慮使用一個YAML解析器: -/ – 2014-10-31 10:33:39

+0

當然,你知道一個命令行YAML解析器?我知道有一堆工具在那裏...... – mimoralea 2014-10-31 16:21:27

回答

1

如果在d之前總是有一個字符使用/[^#]database_name/p

如果不是,您可以使用/\(^\|[^#]\)database_name/p

2

你還不如用awk整個操作:

DATABASE_NAME=$(awk -F' ' '$1!~/^#/ && /database_name/{print $2}' "$CONFIG_PATH") 

這將排除與#(評論)開始的所有行。

+0

或者只是'$ 1 ==「database_name:」{print $ 2}「如果冒號總是出現在'database_name'上。 – 2014-10-29 20:32:23

+0

這是YAML,所以它應該永遠在那裏。 – mimoralea 2014-10-29 20:39:03

+0

@mimoralea如果數據庫的名稱是你想要的並且總是相同的格式,那麼可以使用awk,sed,grep等。但是*要小心*:YAML格式可能會更改,並且'database_name'可能不會單獨存在行(awk,sed等解決方案中斷)。我通常使用[PyYaml](http://pyyaml.org/wiki/PYYAML)來解析YAML文件來解析yaml文件(perl也支持)。 – 2014-10-29 20:48:55

1

我認爲括號一個GNU sed的功能(雖然不知道)

sed -n '/database_name/ {/^[[:blank:]]*#/!p}' 

匹配「數據庫名稱」,如果該行不以空格開頭和哈希然後打印行。

+0

這也適用。 – mimoralea 2014-10-29 21:51:09

0

我結束了使用@ etan-reisner解決方案。

這裏是另一個解決我的具體問題我一路上發現:

DATABASE_NAME=$(cat "$CONFIG_PATH" | grep -v '^[[:space:]]*#' | sed -n '/database_host/p' | awk -F' ' '{print $2}'); 

這將篩選包含一些空間,然後散列每一行。

1

如果文件具有行的起始空格:

sed 's/ //g' file.txt | awk '/^(database)/{print}'