如果我搜索的模式匹配,如何删除文本文件的一部分?
例如:
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。如果找到这种模式,我想删除该特定部分(从泄漏功率(){直到结束括号}开始。)
答案 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), append, close, gets, if, ne (operator), open, proc, puts, regexp, return, set, string, while, Syntax of Tcl regular expressions
Tcl字符串匹配的语法:
*
匹配零个或多个字符的序列?
匹配单个字符[chars]
匹配字符给出的集合中的单个字符(^ 不否定;范围可以 az )\x
匹配字符 x ,即使该字符是特殊字符(*?[]\
之一)答案 1 :(得分:0)
在这里"聪明"方法:
INSERT INTO tbl (col1, col2, ...) VALUES (item1, item2, ...), (item3, item4, ...)
您的数据文件似乎与Tcl语法兼容,因此请像Tcl文件一样执行,对于未知命令,请检查"命令"的最后一个参数。包含您要避免的字符串。
这显然非常冒险,但很有趣。