2013-03-05 71 views
0

文字我爲如何獲取匹配的字符串下呈現TCL

set out " ABC CDE EFG 
      123  456" 

在TCL一個字符串值,我想這是目前下方的文字「EFG」的文字。 現在它是「456」,但它可以是任何東西,所以我需要一種方式,雖然我可以grep爲「EFG」,並獲得它下面的文本。

+0

完全一樣?那裏也有'放出',就像那樣?或者這兩行實際上是相同的長度(或足夠接近)以至於我們可以計數字符? – 2013-03-05 20:29:49

回答

0

在這種情況下,您實際上所擁有的是兩行由3個字母數字字符組成的空格分隔的第2行("\x20ABC\x20CDE\x20EFG\n[string repeat \x20 10]123[string repeat \x20 5]456"將重現您發佈的內容)前綴的大量前導空白字符。在你的例子[string range end-2 end]會給你你需要的。我建議逐行閱讀文件,每次看到EFG時,在下一行提取你需要的部分(也許使用字符串範圍)併發出它。

例如(未經測試):

set state 0 
set f [open $inputfile r] 
while {[gets $f line] != -1} { 
    if {$state} { 
     puts [string range $line end-2 end] 
     set state 0 
    } else { 
     if {[string match "*EFG" $line]} { set state 1 } 
    } 
} 
close $f 
+0

非常感謝。這對我有效。 – SKT 2013-03-06 06:39:23

1

我建議拆分串入鍵和值

lassign [split $out \n] keys values 

,然後尋找在鑰匙串位置和獲得相同的範圍中的值

set start [string first "EFG" $keys] 
set value [string range $values $start [expr {${start}+[string length "EFG"]-1}]] 

將其封裝在proc中,我們得到

proc getValue {input lookFor} { 
    lassign [split $input \n] keys values 
    set start [string first $lookfor $keys] 
    set value [string range $values $start \ 
     [expr {${start}+[string length $lookfor]-1}]] 
} 

調用它像:

getValue $out "EFG" 

編輯:如何是2號線對齊?用製表符(\t),空格?

2

這個答案需要Johannes Kuhn的答案,但我使用regexp從「keys」這一行中得到index這個詞。

# this is as close as I can get to a here-doc in Tcl 
set out [string trim { 
ABC DEF GHI 
123  456 
}] 

# map the words in the first line to the values in the 2nd line 
lassign [split $out \n] keys values 
foreach range [regexp -all -inline -indices {\S+} $keys] { 
    set data([string range $keys {*}$range]) [string range $values {*}$range] 
} 
parray data 

輸出

data(ABC) = 123 
data(DEF) =  
data(GHI) = 456 
+0

這是我會給的答案。 – 2013-03-05 20:30:33

+0

幹得好.. upvote :) – 2013-03-05 21:14:14