Tcl 如何使用regsub查找和替换字符串的第二次出现
我是tcl的新手,正在努力学习,下面需要帮助。 我的字符串看起来像在configFileBuf中,并试图用XYZ替换ConfENB:local udp port>31001“的第二次出现,但在下面的regsub cmd中,我尝试过的总是替换为第一次出现(37896)。Plz帮助如何用XYZ替换第二次出现Tcl 如何使用regsub查找和替换字符串的第二次出现,tcl,Tcl,我是tcl的新手,正在努力学习,下面需要帮助。 我的字符串看起来像在configFileBuf中,并试图用XYZ替换ConfENB:local udp port>31001“的第二次出现,但在下面的regsub cmd中,我尝试过的总是替换为第一次出现(37896)。Plz帮助如何用XYZ替换第二次出现 set ConfigFileBuf "<ConfENB:virtual-phy> </ConfENB:local-ip-addr>
set ConfigFileBuf "<ConfENB:virtual-phy>
</ConfENB:local-ip-addr>
<ConfENB:local-udp-port>37896</ConfENB:local-udp-port>
</ConfENB:local-ip-addr>
<ConfENB:local-udp-port>31001</ConfENB:local-udp-port>
</ConfENB:virtual-phy>"
regsub -start 1 "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>" $ConfigFileBuf "XYZ" ConfigFileBuf
puts $ConfigFileBuf
设置ConfigFileBuf”
37896
31001
"
regsub-开始1“\[\n\t\]+\[0-9\]+”$ConfigFileBuf“XYZ”ConfigFileBuf
放入$ConfigFileBuf
如果您的字符串是格式良好的XML,我建议使用类似于tDOM的方法来操作它。DOM样式的操作几乎总是比基于XML标记的正则表达式操作好。(我提到这一点是因为它实际上应该是XML,而您只是错误地引用了它。)
看起来您正试图使用-start 1
告诉regsub
跳过第一个匹配。起始索引实际上是一个字符索引,因此在此调用中,regsub
将跳过字符串中的第一个字符。您可以将-start
进一步设置到字符串中,但除非使用regexp
计算第一次匹配的结束位置
我认为最好的解决方案是通过调用regexp
和-all-inline-indexs
来获得要匹配的索引列表,使用lindex
选择第二个索引对,最后使用string replace
执行替换,如下所示:
set pattern {</ConfENB:local-ip-addr>[ \n\t]+<ConfENB:local-udp-port>[0-9 ]+</ConfENB:local-udp-port>}
set matches [regexp -all -inline -indices -- $pattern $ConfigFileBuf]
set match [lindex $matches 1]
set ConfigFileBuf [string replace $ConfigFileBuf {*}$match XYZ]
顺便说一句,请注意,如果使用大括号而不是双引号引用正则表达式,则可以避免转义,例如,正则表达式中的字符集
文档链接:,您必须使用
regexp-indexs
找到替换的开始位置,然后才使用regsub
。如果将正则表达式放在它自己的变量中,那还不错
set RE "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>"
set start [lindex [regexp -all -indices -inline $RE $ConfigFileBuf] 1 0]
regsub -start $start RE $ConfigFileBuf "XYZ" ConfigFileBuf
set RE "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>"
set start [lindex [regexp -all -indices -inline $RE $ConfigFileBuf] 1 0]
regsub -start $start RE $ConfigFileBuf "XYZ" ConfigFileBuf
set RE "</ConfENB:local-ip-addr>\[ \n\t\]+<ConfENB:local-udp-port>\[0-9 \]+</ConfENB:local-udp-port>"
set relen [expr {1 + [lindex [regexp -about $RE] 0]}]
set start [lindex [regexp -all -indices -inline $RE $ConfigFileBuf] $relen 0]
regsub -start $start RE $ConfigFileBuf "XYZ" ConfigFileBuf