Bash
如何解析ini文件並將其轉換為bash數組變數?
我正在嘗試將 ini 文件轉換為 bash 數組變數。範例ini如下:
[foobar] session=foo path=/some/path [barfoo] session=bar path=/some/path
所以這些變成:
session[foobar]=foo path[foobar]=/some/path session[barfoo]=bar
等等。
現在,我只能想出這個命令
awk -F'=' '{ if ($1 ~ /^\[/) section=$1; else if ($1 !~ /^$/) print $1 section "=" $2 }'
另外,另一個問題是,它沒有考慮附近的空間
=
。我認為sed
可能更適合這項工作,但我不知道如何在sed
.那麼知道如何做到這一點嗎?
Gawk 接受正則表達式作為欄位分隔符。以下內容消除了等號周圍的空格,但將它們保留在該行的其餘部分。在值周圍添加引號,以便在執行 Bash 分配時保留這些空格(如果有)。我假設部分名稱將是數字變數,但如果您使用的是 Bash 4,則很容易將其調整為使用關聯數組,並將部分名稱本身作為索引。
awk -F ' *= *' '{ if ($1 ~ /^\[/) section=$1; else if ($1 !~ /^$/) print $1 section "=" "\"" $2 "\"" }'
請注意,您可能還希望刪除 Khaled 顯示的空格(僅在 $1 和部分上),因為 Bash 變數名稱不能包含空格。
此外,如果值包含等號,此方法將不起作用。
另一種技術是使用 Bash
while read
循環並在讀取文件時執行分配,declare
這樣可以避免大多數惡意內容。foobar=1 barfoo=2 # or you could increment an index variable each time a section is found while IFS='= ' read var val do if [[ $var == \[*] ]] then section=$var elif [[ $val ]] then declare "$var$section=$val" fi done < filename
同樣,可以很容易地支持關聯數組。