2011-02-17 48 views
0

有一種方法來解析直通包括由{}Š解析通txt文件與由分離元件{} brakets

這裏分隔元件txt文件是從文件的樣品:

virtual vs_devtnet_80 { 
    snat automap 
    pool pool_devtnet_80 
    destination 167.69.107.41:http 
    ip protocol tcp 
    profiles { 
     profile_http_health {} 
     tcp-lan-optimized {} 
    } 
} 
virtual vs_devdpp_4430 { 
    snat automap 
    pool pool_devdpp_5430 
    destination 167.69.107.31:https 
    ip protocol tcp 
    persist devdpp 
    profiles tcp-lan-optimized {} 
} 
virtual vs_devwww30_80 { 
    snat automap 
    pool pool_devwww30_80 
    destination 167.69.107.46:http 
    ip protocol tcp 
    profiles { 
     profile_http_health {} 
     tcp-lan-optimized {} 
    } 
} 

正如你所看到的,這些元素是分開的,但是用{}

任何幫助都會很樂意被讚賞。我試圖使用grep,但它只返回一行...

我想能夠搜索最頂端的元素,例如searh.sh虛擬vs_devtnet_80,並讓它返回整個blob ..此外或許能夠搜索botht誒頂層和它的子層之一,例如search.sh虛擬vs_devtnet_80池這將返回pool_devtnet_80

+0

解析後你想要的結果是什麼?也就是說,你想如何存儲/返回數據? – 2011-02-17 16:19:27

回答

0

喜歡的東西:

cat .tmp | sed '/.*{/ ! { s/.*//g}' 

這不會完全解決,但我認爲它做了類似於你想要的東西

0

看看JSON pasers,它們是用各種語言編寫的,語法看起來非常相似,可以給你一些關於如何解決這個問題的想法。

基本上你需要做的是有一個遞歸函數,當它遇到一個'{'並在遇到'}'時返回內容。 我寫了一篇關於類似lisp的解析器的文章,其實就是這樣。看看這裏尋找靈感:http://www.codeproject.com/KB/linq/TinyLisp.aspx

RGDS格特 - 揚

0

這應該給你的第二個「斑點」,例如:

sed -n '/virtual vs_devdpp_4430.*/,/^}$/p' filename.txt 

和管道通過grep -oP '(?<=pool).*'獲得在下面pool那個blob。

0

這是Tcl語法,因此您可以設置一種機制將其作爲創建自身數據結構的Tcl腳本運行。

#!/usr/bin/env tclsh 

# create a safe slave interpreter 
set slave [interp create -safe] 

# set up the slave to parse the input file 
$slave eval { 
    proc virtual {subkey body} { 
     eval $body 
    } 
    proc unknown {cmd args} { 
     upvar 1 subkey subkey ;# access the 'subkey' variable from the 'virtual' proc 
     if {[llength $args] == 1} {set args [lindex $args 0]} 
     dict set ::data $subkey $cmd $args 
    } 
    set data [dict create] 
} 
$slave expose source 

# now do the parsing in the slave 
$slave eval source [lindex $argv 0] 

# fetch the data structure 
set data [$slave eval set data] 

# and do stuff with it. 
dict for {subkey subdict} $data { 
    puts "$subkey destination = [dict get $subdict destination]" 
} 

,然後parser.tcl input_file輸出

vs_devaetnet_80 destination = 167.69.107.41:http 
vs_devdpp_4430 destination = 167.69.107.31:https 
vs_devwww30_80 destination = 167.69.107.46:http 
0

我最後不得不創建第一次使用strpos查找整個配置文件中的搜索變量的遞歸函數。然後使用彈出的遞歸函數,並從括號中彈出以返回搜索變量的整個主體。