首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

tcl脚本处理文本的一个小坑

这是IC君的第24篇原创文章

新年将至,IC君在这边预祝大家抢票顺利,年终奖数到手软,新年快乐!

最近IC君在写tcl脚本处理文本文件时,遇到的一个小坑。当然这个问题以前也遇到,现在就跟大家分享一下填坑的方法。

这个脚本功能其实很简单,就是一个打开文本文件,读取文件中的每一行,并将每一行的第一个元素和第二个元素输出到屏幕上。tcl文本处理很容易理解,就是把一行的内容作为一个列表,列表再按照空格划分为一个个的元素,然后再对这些元素进行处理。IC君称这种方法为列表元素法。如果想了解更多tcl脚本在ic中的应用,请参考IC君的文章

test.tcl的具体代码内容如下:

要读取文本文件brace.txt也很简单,具体过程如下面的动画所示:

可以看到当文本内容里面没有大括号(花括号),输出是正常的;

但是当文本文件里面含有大括号(花括号),脚本执行错误;

从字面上理解就是说括号不匹配,但是按我们正常的想法,这个括号是文本内容,又不是运行的代码,不匹配又有什么关系呢?

但是tcl脚本编译器就是这么的任性报错,具体的原因我们也不深究了。其实我们遇到这种单个大括号情况还是有一定的概率的,我们写的代码if-else,while 有时候就是一个大括号,与它匹配的大括号在可能下面的某一行。

如何解决这个问题呢? 如果大括号不重要,利用tcl的正则表达式替换掉它,再处理文本:

regsub -all "\{" $line "" line

把上面这一行加到while语句下面,执行就没有问题了;

如果处理文本的时候,这种大括号的情况相当的多。那就直接用tcl正则表达式的替换regsub和匹配regexp来处理文本,不要用读取列表元素的方式。

另外一个例子,当文本里面有中括号[], 如果你用tcl脚本的列表替换功能:

比如把某一行的 you 替换为 me

love you [icstudy] !

如果还是用列表元素的方法去替换,

set line [lreplace $line 1 1 "me"]

最终结果竟然是

love me{[icstudy]}!

比我们预期多加了一对大括号。

这种情况还是可以用正则表达式regsub来处理:

regsub -all "you" $line "me" line

最终得到的结果才是我们想要的。

总结一下,当你用tcl脚本处理的文本里面有大括号或者中括号的时候,使用列表元素法要检查结果是不是预期的;如果不是预期的,建议使用tcl正则表达式整行处理

因为微信后台留言48小时后无法回复,如果IC君没有及时回复你的问题,请再次留言哦,谢谢!

欢迎关注一起学习IC设计

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180210G0EVKC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券