2013-03-05 75 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