2013-03-08 101 views
0

在TCL脚本: 我有一个文件我知道如何寻找一个字符串,但如何获得行号时字符串是found.please回答我,如果有可能如何从tcl中的文件获取两个字符串之间的数据?

set fd [open test.txt r] 
while {![eof $fd]} { 
    set buffer [read $fd] 
} 

set lines [split $buffer "\n"] 
if {[regexp "S1 Application Protocol" $lines]} { 
    puts "string found" 
} else {puts "not found"} 
#puts $lines 

#set i 0 
#while {[regexp -start 0 "S1 Application Protocol" $line``s]==0} {incr i 
#puts $i 
#} 

#puts [llength $lines] 
#puts [lsearch -exact $buffer S1] 
#puts [lrange $lines 261 320] 

在上面的程序中,我得到的输出作为字符串找到.if我会给这个字符串以外的字符串我没有找到字符串。

+0

你尝试过这么远吗?如果你告诉我们你做了什么,你会得到更好的回应。 – Jackson 2013-03-08 11:45:10

+0

我试图用regexp command.i能够找到字符串,但如何从文件中找到行号? – user2147935 2013-03-08 11:50:05

回答

0

'一行'的概念只是我们在我们从文件中获取的数据流之上的一个约定。所以如果你想使用行号,那么你必须自己计算它们。该gets命令documnetion包含以下例子:

set chan [open "some.file.txt"] 
set lineNumber 0 
while {[gets $chan line] >= 0} { 
    puts "[incr lineNumber]: $line" 
} 
close $chan 

所以,你只需要与您的代码来替换看跌语句来找到你想找到的文本模式,当你发现它的$line值给你电话号码。

要复制位于其他两条线之间我会使用类似如下的

set chan [open "some.file.txt"] 
set out [open "output.file.txt" "w"] 
set lineNumber 0 
# Read until we find the start pattern 
while {[gets $chan line] >= 0} { 
    incr lineNumber 
    if { [string match "startpattern" $line]} { 
     # Now read until we find the stop pattern 
     while {[gets $chan line] >= 0} { 
      incr lineNumber 
      if { [string match "stoppattern" $line] } { 
       close $out 
       break 
      } else { 
       puts $out $line 
      } 
     } 
    } 
} 
close $chan 
+0

感谢您的帮助,但它只适用于startin字符串。之后,它不工作。它找到第一个字符串后复制所有文件 – user2147935 2013-03-08 14:03:40

+0

那么你的数据文件是什么样子?什么是开始和停止字符串?你是否检查过你正确地检测到停止字符串?你可以发布一个简短的数据文件,6行左右不起作用吗? – Jackson 2013-03-08 14:39:38

+0

嗨,谢谢你的解决方案。我正在获取2个字符串之间的数据,但它显示的错误消息为 C:\ Users \ atangutu \ Desktop \ anwesh> tclsh task1.tcl 找不到名为“file1276940”的通道 执行 “把$出$线” ( “而” 身体线11)从 内调用 “而{[得到$瓒线]> = 0} { 增量LINENUMBER 如果{[字符串匹配” S1应用协议“$ line”} { #现在阅读,直到找到s ...“ (文件”task1.tcl“line 5) C:\ Users \ atangutu \ Desktop \ anwesh> – user2147935 2013-03-09 05:25:05

0

最简单的方法是使用fileutil::grep命令文本:

package require fileutil 

# Search for ipsum from test.txt 
foreach match [fileutil::grep "ipsum" test.txt] { 
    # Each match is file:line:text 
    set match  [split $match ":"] 
    set lineNumber [lindex $match 1] 
    set lineText [lindex $match 2] 

    # do something with lineNumber and lineText 
    puts "$lineNumber - $lineText" 
} 

更新

我意识到如果该行包含冒号,则lineText在第三个冒号处被截断。因此,而不是:

set lineText [lindex $match 2] 

我们需要:

set lineText [join [lrange $match 2 end] ":"] 
相关问题