我想在文件开始中使用特定字词获取行号。对于下面的例子,我只想得到5号,如果我正在搜索bind。
module checker_m;
// bind
`include "assertions.v"
endmodule
bind top checker_m checker_inst ();
如果你们可以建议我使用Tcl解决方案,那将是最好的 - 我正在使用 Tcl 解释器的工具。任何基于Linux的命令我可以用" exec"是选项。
非常感谢!
答案 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), close, fileutil (package), gets, if, incr, lindex, open, package, puts, set, split, string, while, Syntax 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
一行读取它并在读取时测试这些行,但我当然无法写(几乎)正确地第一次出去。