删除tcl中文件中两个感兴趣实例之间的行

时间:2016-03-29 10:34:35

标签: tcl

早些时候我曾要求一些帮助来删除和替换文件的内容。在彼得的帮助和示例中解决了问题(See this post)。但是它创建了另一个,这个问题与删除行有关。

所以问题是,我可以删除文件中出现的 Prefix_1 的每个实例的行。

但是,在两个实例之间存在跳过的行(因为该行不以Prefix_1开头),因此保留在文件中。

我知道Line以Prefix_1开头,后跟一个点然后是变量名,以空格和等号或冒号结束。

以冒号结尾的每一行都有一个与之关联的表。

我是否会识别出两个以线条和等号结尾的线条,另一个以冒号结束。然后,每当检测到冒号时,删除所有行,直到检测到下一个Prefix_1实例?

Prefix_1.Var1 = -2
Prefix_1.Var2 = 1
Prefix_1.Var3:
    1.1 1.3 1.8 15 1.9 0.1 16 71 31 16 12 1 881 199 19 100 1000 1005 1005 1005
Prefix_1.Var4 = 1
Prefix_1.Var5:
    40 50 75 100 150
Prefix_1.Var6:
    4
    7
    15
    25
    35
    45
Prefix_1.Var7:
    #TABLE 30 2 5 6
    70       70       70       70       70       100      100
    81       80       80       100      100      81       80
    80       100      100      81       80       80       100
    100      82       81       81       100      100      87
    87       87
Prefix_1.Var8 = 1
Prefix_1.Var9 = 65
Prefix_1.Var10:
    255 255 255 255 255 255 255 255 255 255
Prefix_1.Var11:
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 6 1 2 2 0 0 0 0 0 0 0 0
Prefix_1.Var12 = 30

删除Prefix_1后的所有行后,我仍然留下这两行介于两个Prefix_1实例之间。

我也想删除这些。

1.1 1.3 1.8 15 1.9 0.1 16 71 31 16 12 1 881 199 19 100 1000 1005 1005 1005
40 50 75 100 150
4
7
15
25
35
45
#TABLE 30 2 5 6
70       70       70       70       70       100      100
81       80       80       100      100      81       80
80       100      100      81       80       80       100
100      82       81       81       100      100      87
87       87
255 255 255 255 255 255 255 255 255 255
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 6 1 2 2 0 0 0 0 0 0 0 0

1 个答案:

答案 0 :(得分:0)

此答案扩展了我的earlier answer here

简单修复:替换

    default {
        lappend buf $line
    }

    {^Prefix} {
        lappend buf $line
    }
    default {}

如果您正在使用upvar变体或

    default {
        return $line
    }

    {^Prefix_} {
        return $line
    }
    default {}

否则。

这意味着默认操作是跳过一行,只有当行的编号前缀不是" Prefix_1"时才会保留这些行。

此解决方案并不遵守文件中的数据语法,这是不能令人满意的,但如果它有效,它应该足够好了。

计算Prefix_1的出现次数

您可以记录以" Prefix_1"开头的第一行和最后一行的行号,但为此,您需要更多在处理命令之外持久存储的数据。这可能是切换到面向对象编程的好时机。

oo::class create LineProcessor {
    variable first last count buffer
    constructor args {
        set first 0
        set last 0
        set count 0
        set buffer {}
    }
    method process line {
        incr count
        switch -regexp $line {
            {^Prefix_1\.} {
                if {$first == 0} {
                    set first $count
                }
                set last $count
                return {}
            }
            {^Prefix_2\.} {
                lappend buffer [regsub 2 $line 999]
            }
            {^Prefix_} {
                lappend buffer $line
            }
            default {}
        }
    }
    method dump {} {
        join $buffer \n
    }
    method report {} {
        puts "First/last line with Prefix_1: $first/$last"
    }
}

LineProcessor create lp

fileutil::foreachLine line data.txt {
    lp process $line
}
fileutil::writeFile data.txt [lp dump]
lp report
# => First/last line with Prefix_1: 1/40

此代码与以前大致相同,只有一些逻辑用于在" Prefix_1"的子句中记录行号,并且支持变量封装在对象中而不是全局数据。 / p>