这是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设计
领取专属 10元无门槛券
私享最新 技术干货