Tcl regsub替换文件中十六进制字符串问题求助
问题分析与解决
错误原因
你用的正则表达式X"*"逻辑不对。在Tcl的正则语法里,*是匹配前面字符的零次或多次,所以X"*"实际匹配的是X后面跟着任意数量的双引号(包括零个),而不是完整的X"xxxxxx"结构。
比如原内容是X"11223344",X"*"只会匹配X"这部分,替换后就变成X"ABCDEF12"加上剩下的11223344",这就是你看到奇怪结果的原因。
正确写法
要匹配X"任意十六进制内容"的完整结构,应该用正则表达式X"[^"]+":
[^"]:匹配任意非双引号的字符+:表示至少匹配一个这样的字符,确保引号间有内容- 加上
-all选项可以全局替换所有符合格式的字符串(默认regsub只替换第一个匹配项)
正确的regsub命令如下:
regsub -all {X"[^"]+"} $content {X"ABCDEF12"} new_content
之后new_content就是替换后的结果,所有X"xxxxxx"格式的字符串都会被替换成X"ABCDEF12"。
示例验证
假设原$content内容为:
foo X"12312312" bar X"456789AB" baz
执行上述命令后,new_content会变成:
foo X"ABCDEF12" bar X"ABCDEF12" baz
内容的提问来源于stack exchange,提问作者GLW75
相关产品推荐
相关产品推荐

