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

如果使用tcl发现模式匹配,如何删除文本文件的一部分?,tcl,Tcl,如果搜索的模式匹配,如何删除文本文件的一部分 例如: 我的图案是相关的。如果找到了这个模式,我想删除这个特定的部分(从漏功率()开始{直到结束括号}) 从代码的最后一段开始,我们打开一个文件进行阅读(通过通道$f),然后获得一个部分。(获取一个节的过程有点复杂,因此它进入一个命令过程以避免妨碍。)只要非空节不断出现,我们就检查模式是否出现:如果没有,我们通过通道$g将节打印到输出文件中。然后我们得到下一个部分并进入下一个迭代 要获得一个部分,首先假设我们还没有看到该部分的任何部分。然后我们继续读

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

例如:

我的图案是相关的。如果找到了这个模式,我想删除这个特定的部分(从漏功率()开始{直到结束括号})

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

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

文件: , , , , , , , , , , , , , , ,

Tcl字符串匹配的语法:

  • *
    匹配零个或多个字符的序列
  • 匹配单个字符
  • [chars]
    匹配chars给定的集合中的单个字符(^不求反;范围可以用a-z表示)
  • \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