我希望能够在文件中遇到匹配模式之前打印10行和10行。我通过正则表达式匹配模式。我需要一个TCL特定的解决方案。我基本上需要相当于 grep -B 10 -A 10 功能。
提前致谢!
答案 0 :(得分:1)
如果数据“相对较小”(在现代计算机上实际上可能是100MB或更多),那么您可以将其全部加载到Tcl中并在那里进行处理。
# Read in the data
set f [open "datafile.txt"]
set lines [split [read $f] "\n"]
close $f
# Find which lines match; adjust to taste
set matchLineNumbers [lsearch -all -regexp $lines $YourPatternHere]
# Note that the matches are already in order
# Handle overlapping ranges!
foreach n $matchLineNumbers {
set from [expr {max(0, $n - 10)}]
set to [expr {min($n + 10, [llength $lines] - 1)}]
if {[info exists prev] && $from <= $prev} {
lset ranges end $to
} else {
lappend ranges $from $to
}
set prev $to
}
# Print out the ranges
foreach {from to} $ranges {
puts "=== $from - $to ==="
puts [join [lrange $lines $from $to] "\n"]
}
答案 1 :(得分:0)
让您想到的唯一机制是将输入数据拆分为行列表。然后,您需要浏览列表,并在每次找到匹配项时从列表中输出合适的条目集合。
据我所知,没有内置的,简单的方法。
tcllib
可能会有用。
我自己使用grep
。