首页 > 解决方案 > TCL 脚本查找脚本并在搜索字符串之前添加新文本

问题描述

以下是我的输入文件的部分内容:

   xyz 
   abc
   MainContent(abc_dt) {
      sc: it;
    }
    MainContent(xyz_cnt) {
      sc : it;
    }
    MainContent(asd_zxc) {
      sc : it;
    }

在这里,我想搜索“MainContent”行并想在它之前添加新行......这个新行应该有“Sb(MainContent_1中括号内的文本)”......这也应该添加左括号和右括号在下一次 Sb 出现之前:

脚本的预期输出:

   xyz 
   abc
   Sb(abc_dt_sb1) {
   MainContent(abc_dt) {
      sc: it;
    }
   }
   Sb(xyz_cnt_sb2) {
    MainContent(xyz_cnt) {
      sc : it;
    }
   } 
   Sb(asd_zxc_sb3) {
      MainContent(asd_zxc) {
      sc : it;
    }
   }

有人可以帮我为此创建一个 TCL 脚本吗?

标签: shelltcltk

解决方案


此代码将在标准输入上处理您的文本并在标准输出上生成结果。根据需要重定向它。

set counter 0
set expectBrace false
while {[gets stdin line] >= 0} {
    if {!$expectBrace && [regexp {^\s*MainContent\s*\((\w+)\)} $line -> bits]} {
        puts [format "Sb(%s_sb%d) \{" $bits [incr counter]]
        set expectBrace true
    }
    puts $line
    if {$expectBrace && [regexp {^\s*\}\s*$} $line]} {
        puts "\}"
        set expectBrace false
    }
}

使用正则表达式来匹配小型状态机(两个状态,由 控制expectBrace)中状态变化的触发器是非常传统的解析。我曾经在行format中进行替换Sb(…);这些很简单,如果您愿意,您可以使用直接替换。

我没有做任何关于添加缩进的事情。


推荐阅读