【问题标题】:TCL Code to Convert fileTCL 代码转换文件
【发布时间】:2016-02-19 20:52:14
【问题描述】:

我有一个巨大的文件,其中包含不同的字段,如下所示:

ip server-ip-address = 20.29.77.10/22
tcp either-port = 80

我需要编写脚本将这些字段转换为以下格式。最有效的方法是什么?

remote-ip 20.29.77.10/22
remote-port eq 80

【问题讨论】:

    标签: tcl


    【解决方案1】:

    我建议最有效的方法是调用 sed:

    exec sed -i {
        s/^ip server-ip-address =/remote-ip/
        s/^tcp either-port =/remote-port eq/
    } $filename
    

    【讨论】:

    • 执行外部程序实际上并没有运行 Tcl,所以这似乎是一个无效的答案。
    • Tcl 是一种通用脚本语言。所有这些语言都可以调用外部程序。如果这些程序更快和/或更高效,那么为什么不使用该功能呢? Tcl 真的是我的初恋,它从未让我心碎。但我也喜欢 sed、awk 和 perl。您必须选择最适合这项工作的工具。
    • 因为 Tcl 包含了涵盖此类功能的 regexp 和 regsub 命令。是的,可以执行 sed,但是当该功能已经直接内置到 Tcl 中时,为什么会有任何意义。此外,如果不使用 exec,脚本的可移植性会大大提高。这不是可以的问题,而是应该的问题。
    • 还有一些问题:需要投入多少开发时间;我们是否正在重新发明一个已经经过充分测试的轮子?它将运行多快;它将消耗多少内存;等等等等
    • 你为什么认为我需要说服?我已经给出了我的答案,你已经给出了你的答案——现在由选民和 OP 决定。不要忘记,OP 并不是唯一可以从本页提供的建议中受益的人,因此最好有多种方法来解决这个问题。此外,根据我在这里的经验,那些提出问题的人经常得到他们没有想到甚至不知道的“左域”答案的帮助。
    【解决方案2】:

    Glenn Jackman 的解决方案可以在缺少sed(未经测试的代码)的系统上这样实现:

    package require fileutil
    
    proc conv data {
        regsub -all -line {^ip server-ip-address =} $data remote-ip data
        regsub -all -line {^tcp either-port =} $data {remote-port eq}
    }
    
    ::fileutil::updateInPlace $filename conv
    

    我想sed 在可用的情况下更快。

    文档:fileutil 包、packageprocregsub

    【讨论】:

      【解决方案3】:

      最有效的方法是编写一个匹配整行的正则表达式命令,并将输入提取为一系列标记。您必须预先知道所有标记是什么,因此它们可以包含在 regexp 命令中,但基本上只需 1 个命令即可完成整个解析操作。另一种方法是在整行上使用 split 命令并将 " " 作为第三个参数传递,然后使用 foreach 命令遍历每个字符串标记。

      【讨论】:

      • 我更新了问题的格式。你可能想重新审视你的答案。
      猜你喜欢
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多