文字我为如何获取匹配的字符串下呈现TCL
set out " ABC CDE EFG
123 456"
在TCL一个字符串值,我想这是目前下方的文字“EFG”的文字。 现在它是“456”,但它可以是任何东西,所以我需要一种方式,虽然我可以grep为“EFG”,并获得它下面的文本。
文字我为如何获取匹配的字符串下呈现TCL
set out " ABC CDE EFG
123 456"
在TCL一个字符串值,我想这是目前下方的文字“EFG”的文字。 现在它是“456”,但它可以是任何东西,所以我需要一种方式,虽然我可以grep为“EFG”,并获得它下面的文本。
在这种情况下,您实际上所拥有的是两行由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
非常感谢。这对我有效。 – SKT 2013-03-06 06:39:23
我建议拆分串入键和值
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
),空格?
这个答案需要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
这是我会给的答案。 – 2013-03-05 20:30:33
干得好.. upvote :) – 2013-03-05 21:14:14
完全一样?那里也有'放出',就像那样?或者这两行实际上是相同的长度(或足够接近)以至于我们可以计数字符? – 2013-03-05 20:29:49