replace - 在 tcl 中查找并替换文件中的数字
问题描述
我有一个巨大的文件。我需要找到包含模式 abc_x 的行并将其值 0.34 替换为增加值的 10%。然后将整个文件(带有替换值)复制到一个新文件中。我是 Tcl 的新手,请告诉我该怎么做。提前致谢。
解决方案
这包括三个关键阶段:
读入旧文件。
更新内存中的数据。
写出新文件。
第一阶段和第三阶段非常标准:
set f [open input.txt]
set data [read $f]
close $f
set f [open output.txt "w"]
puts -nonewline $f $data
close $f
所以现在只需要在内存中进行转换。对此的最佳答案取决于您使用的 Tcl 版本。在所有当前的生产版本中,最好将数据拆分为行并对其进行迭代,检查行是否匹配,如果匹配,则执行转换。
set lines {}
foreach line [split $data "\n"] {
if {[matchesPattern $line]} {
set line [updateLine $line]
}
lappend lines $line
}
set data [join $lines "\n"]
好的,在上面的代码中,matchesPattern
并且updateLine
是真实代码的替代品,可能如下所示:
if {[regexp {^(\s*abc_x\s+)([\d.]+)(.*)$} $line -> prefix value suffix]} {
# Since we matched the prefix and suffix, we must put them back
set line $prefix[expr {$value * 1.1}]$suffix
}
将所有这些部分组合在一起可以得到:
set f [open input.txt]
set data [read $f]
close $f
set lines {}
foreach line [split $data "\n"] {
if {[regexp {^(\s*abc_x\s+)([\d.]+)(.*)$} $line -> prefix value suffix]} {
set line $prefix[expr {$value * 1.1}]$suffix
}
lappend lines $line
}
set data [join $lines "\n"]
set f [open output.txt "w"]
puts -nonewline $f $data
close $f
在 8.7 中,您将能够更简洁地编写更新:
set data [regsub -all -line -command {^(\s*abc_x\s+)([\d.]+)} $data {apply {{-> prefix value} {
# Since we matched the prefix, we must put it back
string cat $prefix [expr {$value * 1.1}]
}}}]
(变得比这更短确实需要一个支持后视的 RE 引擎;Tcl 的标准引擎不支持。)
推荐阅读
- swift - 将值写入 iOS Metal 中的 float4x4 矩阵 - 替换现有的浮点值
- terraform - Azure api 管理 api 策略 terraform
- r - dplyr::slice() 出错 - env 必须是环境
- r - 使用 Mantel 测试通过 R 中的距离计算隔离度
- reactjs - 使用 setState 反应不重新渲染组件
- excel - 我需要遍历 24 列并将 countif 用于 6 个不同的标准,其中值位于另一个工作表上的 6 个不同单元格中
- javascript - 如何访问axios实例的baseURL
- excel - 需要找到一个序列公式根据固定值连续减少2个值
- android - Android警报对话框故障
- installation - WIX 引导程序 UI 标题栏颜色更改