【问题标题】:tcl search and replacetcl 搜索和替换
【发布时间】:2020-07-16 00:41:11
【问题描述】:

我有一个输入文件,我想做一个搜索/替换、乘法和转储输出文件。我在 TCL 中如何做到这一点?

  • 所有数字都需要乘以 10 的倍数。
  • 它需要查找 SECTION 和 END SECTION 并找到单词“shape”并将所有数字乘以 10。

输入文件


heading
      size 9 XY 9

      section1
        shape name 1 2 3 4
      end section1

      section 2
        shape name 1 2 3 4
      end section2


输出文件:


heading
      size 90 XY 90

      section1
        shape name 5 10 15 20
      end section1

      section 2
        shape name 100 200 300 400
      end section2



tcl
set multiplier1 10
set multiplier2 5
set multiplier3 100

while {[gets $infile1] > 0} {

    if {[regexp "size" $value]} {
            
}

【问题讨论】:

    标签: search replace tcl


    【解决方案1】:

    首先,最好将乘数定义为数组。使用以变量命名的变量通常是个坏主意(除非您要使用 upvar 它们)。另外,请记住它们是关联数组,因此您可以使用任何字符串作为索引,而不仅仅是数字;这有时很有用。

    set multiplier(1) 10
    set multiplier(2) 5
    set multiplier(3) 100
    

    其次,最好使用辅助程序对一行数字进行乘法运算:

    proc ApplyMultiplies {line multiplier} {
        set NUMBER_RE {-?\d+}
        # For all locations of numbers, in *reverse* order
        foreach location [lreverse [regexp -all -indices -inline -- $NUMBER_RE $line]] {
            # Get the number
            set value [string range $line {*}$location]
            # Multiply it
            set value [expr {$value * $multiplier}]
            # Write it back into the string
            set line [string replace $line {*}$location $value]
        }
        return $line
    }
    

    以交互方式测试:

    % ApplyMultiplies {shape name 1 2 3 4} 5
    shape name 5 10 15 20
    % ApplyMultiplies "tricky_case\"123 yo" 17
    tricky_case"2091 yo
    

    在 Tcl 8.7 中,由于 regsub 的新 -command 选项,您将能够以单行方式执行此操作:

    proc ApplyMultiplies {line multiplier} {
        regsub -all -command -- {-?\d+} $line [list ::tcl::mathop::* $multiplier]
    }
    

    我不明白您决定是否应用该操作的条件。 multiplier 的索引是否意味着部分名称,但不知何故有点偏离?为什么我们要在size 行上相乘?不理解这一点,我不可能编写外部控制代码。

    【讨论】:

    • 也可以用regsub + subst 来做事,但是在复杂的情况下它们非常很难正确处理;这样很容易造成安全漏洞。一旦你了解了这项技术,浏览反向索引列表就会简单得多。
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 2020-07-20
    • 2014-09-13
    • 2019-05-05
    • 2011-02-20
    • 2012-12-25
    • 2010-10-05
    相关资源
    最近更新 更多