如果找到匹配使用tcl的模式,如何删除文本文件的一部分?

时间:2016-12-08 10:58:48

标签: tcl

如果我搜索的模式匹配,如何删除文本文件的一部分?

例如:

  pg_pin (VSS) {
  direction : inout;
  pg_type : primary_ground;
  related_bias_pin : "VBN";
  voltage_name : "VSS";
}
leakage_power () {
  value : 0;
  when : "A1&A2&X";
  **related_pg_pin** : VBN;
}

我的模式是related_pg_pin。如果找到这种模式,我想删除该特定部分(从泄漏功率(){直到结束括号}开始。)

2 个答案:

答案 0 :(得分:3)

proc getSection f {
    set section ""
    set inSection false
    while {[gets $f line] >= 0} {
        if {$inSection} {
            append section $line\n
            # find the end of the section (a single right brace, #x7d)
            if {[string match \x7d [string trim $line]]} {
                return $section
            }
        } else {
            # find the beginning of the section, with a left brace (#x7b) at the end
            if {[string match *\x7b [string trim $line]]} {
                append section $line\n
                set inSection true
            }
        }
    }
    return
}

set f [open data.txt]
set g [open output.txt w]
set section [getSection $f]
while {$section ne {}} {
    if {![regexp related_pg_pin $section]} {
        puts $g $section
    }
    set section [getSection $f]
}
close $f
close $g

从代码的最后一段开始,我们打开一个文件进行阅读(通过频道$f),然后得到一个部分。 (获取一个部分的过程有点复杂,所以它会进入一个命令过程。)只要非空部分不断出现,我们检查模式是否发生:如果没有,我们打印通过通道$g到输出文件的部分。然后我们得到下一部分并进入下一次迭代。

要获得一个部分,首先假设我们还没有看到某个部分的任何部分。然后我们继续读取行,直到找到文件的末尾。如果找到以左括号结尾的行,我们将其添加到该部分并记下我们现在在一个部分中。从那时起,我们将每一行添加到该部分。如果找到由单个右括号组成的行,我们退出该过程并将该部分传递给调用者。

文档: ! (operator)>= (operator)appendclosegetsifne (operator)openprocputsregexpreturnsetstringwhileSyntax of Tcl regular expressions

Tcl字符串匹配的语法:

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

答案 1 :(得分:0)

在这里"聪明"方法:

    INSERT INTO tbl (col1, col2, ...) VALUES (item1, item2, ...), (item3, item4, ...)

您的数据文件似乎与Tcl语法兼容,因此请像Tcl文件一样执行,对于未知命令,请检查"命令"的最后一个参数。包含您要避免的字符串。

这显然非常冒险,但很有趣。