2017-05-17 26 views
1

我有一個包含基於XXX或文件類似的數據需要根據從配置文件中的一個關鍵的取值幫助

[xxx] 

name = xxx 
address = bangalore 

[yyy] 

name = yyy 
address = sjc 

請幫我得到一個正則表達式,我可以取地址/名稱值YYY(XXX或YYY和地址或名稱是輸入)

+0

用編程語言比如'PHP'或'Python'可以輕鬆完成,這是否可能? – Jan

+0

謝謝!!請建議python,我可以在環境中嘗試並更新你。 – udaya

回答

2

你可以做這樣的事情與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,所以最好使用全配置文件分析器。您可以使用具有健壯庫的PerlPython來解析.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' 
2

正則表達式來救援!
此方法將條目拆分爲單個元素,然後解析鍵值對。最後,你可以簡單地問你的結果字典爲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'}} 
0

這不,如果你想搜索的方括號或「名稱」標籤的值中的數值清楚,但這裏是你的問題的一個可能解釋一個解決方案:

$ 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