在以特定单词开头的文件中查找该行

时间:2016-09-29 22:34:23

标签: search find tcl

我想在文件开始中使用特定字词获取行号。对于下面的例子,我只想得到5号,如果我正在搜索bind。

module checker_m;
// bind
`include "assertions.v"
endmodule
bind top checker_m checker_inst ();

如果你们可以建议我使用Tcl解决方案,那将是最好的 - 我正在使用 Tcl 解释器的工具。任何基于Linux的命令我可以用" exec"是选项。

非常感谢!

3 个答案:

答案 0 :(得分:1)

使用gets的解决方案:

set word bind
set n 0
set f [open file]
while {[gets $f line] >= 0} {
    incr n
    if {[string match $word* $line]} {
        puts "Line $n"
    }
}
close $f

使用fileutil包的类似解决方案。

package require fileutil

set word bind
set n 0
::fileutil::foreachLine line file {
    incr n
    if {[string match $word* $line]} {
        puts "Line $n"
    }
}

单线解决方案:

lindex [split [lindex [::fileutil::grep ^$word\\M file] 0] :] 1

文档: >= (operator)closefileutil (package)getsifincrlindexopenpackageputssetsplitstringwhileSyntax of Tcl regular expressions

Tcl字符串匹配的语法:

  • *匹配零个或多个字符的序列
  • ?匹配单个字符
  • [chars]匹配字符给出的集合中的单个字符(^ 否定;范围可以 az
  • \x匹配字符 x ,即使该字符是特殊字符(*?[]\之一)

答案 1 :(得分:1)

set lineno [exec grep -n {^bind\>} $filename | cut -d: -f1]

答案 2 :(得分:0)

假设文件名保存在变量fnm中,并且您要搜索的单词列表位于变量候选中,那么这样的东西应该有效:

# Read in all the input data

set fil [open $fnm]
set data [read $fil]
close $fnm

# Check each input line to see whether if the first word appears in the
# candidate list

set lineNo 0
foreach line [split $data \n] {
    incr lineNo
    set words [split $line " "]
    set firstWord [lindex $words 0]
    if {[lsearch $candidates $firstWord] >= 0} {
        puts stdout "Line $lineNo starts with $firstWord"
    }
}

免责声明:我实际上没有对此进行测试,因此可能包含一些愚蠢的错误,但我相信它正确地说明了这些原则。如果您的输入文件非常大,您可能最好使用gets一行读取它并在读取时测试这些行,但我当然无法写(几乎)正确地第一次出去。

祝你好运