如果使用tcl发现模式匹配,如何删除文本文件的一部分?
如果搜索的模式匹配,如何删除文本文件的一部分 例如: 我的图案是相关的。如果找到了这个模式,我想删除这个特定的部分(从漏功率()开始{直到结束括号}) 从代码的最后一段开始,我们打开一个文件进行阅读(通过通道如果使用tcl发现模式匹配,如何删除文本文件的一部分?,tcl,Tcl,如果搜索的模式匹配,如何删除文本文件的一部分 例如: 我的图案是相关的。如果找到了这个模式,我想删除这个特定的部分(从漏功率()开始{直到结束括号}) 从代码的最后一段开始,我们打开一个文件进行阅读(通过通道$f),然后获得一个部分。(获取一个节的过程有点复杂,因此它进入一个命令过程以避免妨碍。)只要非空节不断出现,我们就检查模式是否出现:如果没有,我们通过通道$g将节打印到输出文件中。然后我们得到下一个部分并进入下一个迭代 要获得一个部分,首先假设我们还没有看到该部分的任何部分。然后我们继续读
$f
),然后获得一个部分。(获取一个节的过程有点复杂,因此它进入一个命令过程以避免妨碍。)只要非空节不断出现,我们就检查模式是否出现:如果没有,我们通过通道$g
将节打印到输出文件中。然后我们得到下一个部分并进入下一个迭代
要获得一个部分,首先假设我们还没有看到该部分的任何部分。然后我们继续读取行,直到找到文件的结尾。如果找到一条以左大括号结尾的线,我们将其添加到剖面中,并注意我们现在在剖面中。从那时起,我们将每一行添加到节中。如果找到由单个右大括号组成的行,我们将退出该过程并将节传递给调用者
文件:
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
Tcl字符串匹配的语法:
匹配零个或多个字符的序列*
匹配单个字符?
匹配chars给定的集合中的单个字符(^不求反;范围可以用a-z表示)[chars]
匹配字符x,即使该字符是特殊字符(其中一个\x
)*?[]\
- 这里有一个“聪明”的方法:
proc unknown args {
set body [lindex $args end]
if {[string first "related_pg_pin" $body] == -1} {puts $args}
}
source file.txt
您的数据文件似乎与Tcl语法兼容,因此请像执行Tcl文件一样执行它,对于未知命令,请检查“command”的最后一个参数是否包含要避免的字符串
这显然是非常危险的,但它很有趣。在这种情况下,您可以
源代码内容,而不是打开-阅读-关闭-评估--ing它。您能在安全的tcl解释器中执行此操作以消除代码注入风险吗?如果是,你能在回答中加上这个吗?
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
proc unknown args {
set body [lindex $args end]
if {[string first "related_pg_pin" $body] == -1} {puts $args}
}
source file.txt