我有一個包含基於XXX或文件類似的數據需要根據從配置文件中的一個關鍵的取值幫助
[xxx]
name = xxx
address = bangalore
[yyy]
name = yyy
address = sjc
請幫我得到一個正則表達式,我可以取地址/名稱值YYY(XXX或YYY和地址或名稱是輸入)
我有一個包含基於XXX或文件類似的數據需要根據從配置文件中的一個關鍵的取值幫助
[xxx]
name = xxx
address = bangalore
[yyy]
name = yyy
address = sjc
請幫我得到一個正則表達式,我可以取地址/名稱值YYY(XXX或YYY和地址或名稱是輸入)
你可以做這樣的事情與awk
如果你的文件就是如此(即name
相同的部分,它是address
之前) :
$ awk -v nm='yyy' -F ' *= *' '$1=="name" && $2==nm{infi=1; next}
$1=="address" && infi {print $2; infi=0}' file
sjc
或者更好的是你可以得到的部分,然後他們發生取鑰匙,價值和打印出來,然後退出:
$ awk -v sec='yyy' -v key='address' '
BEGIN{
FS=" *= *"
pat=sprintf("^\\[%s\\]", sec)}
$0 ~ pat {secin=$1; next}
NF==2 && $1==key && secin ~ pat {print $2; exit}' file
sjc
如果你要收集他們的鍵/值對所有章節,你可以做(與gawk
):
$ gawk 'BEGIN{FS=" *= *"}
/^\[[^\]]+\]/ && NF==1 {sec=$1; next}
NF==2 {d[sec][$1]=$2}
END{ for (k in d){
printf "%s: ",k
for (v in d[k])
printf "\t%s = %s\n", v, d[k][v]
}
}' file
[xxx]: address = bangalore
name = xxx
[yyy]: address = sjc
name = yyy
配置或.ini文件可以引述如CSV,所以最好使用全配置文件分析器。您可以使用具有健壯庫的Perl或Python來解析.ini或配置類型文件。
Python的例子:
#!/usr/bin/python
import ConfigParser
config = ConfigParser.ConfigParser()
config.read("/tmp/file")
然後你就可以抓住部分,每個部分中的項目,或特定物品的特定部分:
>>> config.sections()
['xxx', 'yyy']
>>> config.items("yyy")
[('name', 'yyy'), ('address', 'sjc')]
>>> config.get("xxx", "address")
'bangalore'
正則表達式來救援!
此方法將條目拆分爲單個元素,然後解析鍵值對。最後,你可以簡單地問你的結果字典爲ie。 values['xxx']
。
見a demo on ideone.com。
import re
string = """
[xxx]
name = xxx
address = bangalore
[yyy]
name = yyy
address = sjc
"""
rx_item = re.compile(r'''
^\[(?P<name>[^][]*)\]
.*?
(?=^\[[^][]*\]$|\Z)
''', re.X | re.M | re.DOTALL)
rx_value = re.compile(r'^(?P<key>\w+)\s*=\s*(?P<value>.+)$', re.MULTILINE)
values = {item.group('name'): {
m.group('key'): m.group('value')
for m in rx_value.finditer(item.group(0))}
for item in rx_item.finditer(string)
}
print(values)
# {'xxx': {'name': 'xxx', 'address': 'bangalore'}, 'yyy': {'name': 'yyy', 'address': 'sjc'}}
這不,如果你想搜索的方括號或「名稱」標籤的值中的數值清楚,但這裏是你的問題的一個可能解釋一個解決方案:
$ cat tst.awk
BEGIN { FS=" *= *" }
!NF { next }
NF<2 { prt(); k=$0 }
{ map[$1] = $2 }
END { prt() }
function prt() { if (k=="["key"]") print map[tag]; delete map }
$ awk -v key='yyy' -v tag='address' -f tst.awk file
sjc
$ awk -v key='xxx' -v tag='address' -f tst.awk file
bangalore
$ awk -v key='xxx' -v tag='name' -f tst.awk file
xxx
用編程語言比如'PHP'或'Python'可以輕鬆完成,這是否可能? – Jan
謝謝!!請建議python,我可以在環境中嘗試並更新你。 – udaya