文字我爲如何獲取匹配的字符串下呈現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