在TCL中匹配regexp之前和之后打印行

时间:2014-02-12 12:50:57

标签: regex file tcl

我希望能够在文件中遇到匹配模式之前打印10行和10行。我通过正则表达式匹配模式。我需要一个TCL特定的解决方案。我基本上需要相当于 grep -B 10 -A 10 功能。

提前致谢!

2 个答案:

答案 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