【问题标题】:Working with file containing unmatched braces使用包含不匹配大括号的文件
【发布时间】:2017-12-15 14:13:50
【问题描述】:

我需要修改一个文件,其中包含几行不匹配的大括号,例如:

  rmsd {
    atoms {
      atomsFile 
      atomsCol B
      atomsColValue 1
    }

如果我这样做:

set fp [open "fpor.conf" r]
set file_data [read $fp]
close $fp
set confFile [split $file_data "\n"]

set inOut [open "us.in" w]

foreach line $inFile {
     if {[lindex $line 0] == "atomsFile"} {
        lappend line "us.pdb"
     }
     puts $inOut "$line"
}
close $inOut

脚本失败并出现以下错误: 列表中不匹配的左大括号。有没有办法避免这种情况?

【问题讨论】:

    标签: file tcl curly-braces


    【解决方案1】:

    您将文件读入行列表,然后遍历行。您的错误是将行视为列表而不是字符串。这将帮助您:

    foreach line $confFile {
        set fields [regexp -all -inline {\S+} $line]
        if {[lindex $fields 0] eq "atomsFile"} { ...
    
    • 这里,split 不足以找到以空格分隔的单词,因为 split 会拆分单个字符:

      % set line {      atomsFile }
            atomsFile 
      % split $line
      {} {} {} {} {} {} atomsFile {}
      

    或者只是做正则表达式匹配:

    foreach line $confFile {
        if {[regexp {^\s*atomsFile} $line]} { ...
    

    正如您所注意到的,您不能像处理列表一样处理任意字符串。

    % set line "no { match here"
    no { match here
    % lindex $line 0
    unmatched open brace in list
    % lindex [split $line] 0
    no
    

    【讨论】:

      【解决方案2】:

      如果您打算按如下方式更新文件,

      atomsFile us.pdb
      

      然后,不检查存在的列表索引,而只检查单词。

      if {[regexp atomsFile $line]} {
          lappend line "us.pdb"
      }
      

      【讨论】:

      • 这正是我所需要的。非常感谢!
      【解决方案3】:

      当文件的内容是不正确的列表时,最好将其仅视为文本。

      set fp [open "fpor.conf" r]
      set file_data [read $fp]
      close $fp
      set fp [open "us.in" w]
      puts -nonewline $fp [regsub -line -all {^(\s*atomsFile.*)$} $file_data {\1us.pdb}]
      close $fp
      

      或者,更高级一点:

      package require fileutil
      
      proc appendIt file_data {
          regsub -line -all {^(\s*atomsFile.*)$} $file_data {\1us.pdb}   
      }
      
      ::fileutil::writeFile us.in [appendIt [::fileutil::cat fpor.conf]]
      

      文档: close, fileutil (package), open, package, proc, puts, read, regsub, set, Syntax of Tcl regular expressions

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        相关资源
        最近更新 更多