regsub 1 space 单词之间到“_”

regsub 1 space between words to "_"

谁能帮忙将单词之间的 1 space 注册为“_”(TCL)?

原行:

CTS__94331/I (DCCKBD8BWP240H11P57PDULVT)     0.025      0.002 &    0.352 r

需求行:

CTS__94331/I_(DCCKBD8BWP240H11P57PDULVT)     0.025      0.002_&    0.352_r

我尝试了下面的方法,但每个 space 都替换为“”,我只想将 1 个 space 替换为“

regsub -all {\s{1}} $a _

regsub 1 space between words to "_"

对于这种情况,您可以考虑string map:

% string map {" " "_"} {CTS__94331/I (DCCKBD8BWP240H11P57PDULVT)}
CTS__94331/I_(DCCKBD8BWP240H11P57PDULVT)

但是,您的示例数据不一致,我没有看到要替换多个空格的示例?

您需要在正则表达式中偷偷摸摸并使用不同的替代品。

regsub -all {(\S)\s(?=\S)} $a {_}

正则表达式匹配(并捕获)一个非白色space,后跟一个白色space,然后要求(使用先行约束)下一个字符是非白色space 而不匹配它。这将替换为您匹配的第一个字符(将其替换为自身)和下划线。


通常情况下,您会使用 \y\s\y_,但这在您的用例中不起作用,因为它无法正确处理 0.002 &&不是单词字符)。

如果 Tcl 的 RE 引擎支持 lookbehind 约束(它不支持),这将更容易解决,因为您不需要将 space 之前的字符替换为自身的技巧。