Tcl regsub 1字词之间的空格至_&引用;

Tcl regsub 1字词之间的空格至_&引用;,tcl,Tcl,有人能帮我把单词之间的空格改成“uu”(TCL)吗 原始行: CTS__94331/I (DCCKBD8BWP240H11P57PDULVT) 0.025 0.002 & 0.352 r 要求行: CTS__94331/I_(DCCKBD8BWP240H11P57PDULVT) 0.025 0.002_& 0.352_r 我尝试了以下操作,但每个空格都替换为“”,我只需要1个空格替换为“” regsub 1字词之间的空格至“\u

有人能帮我把单词之间的空格改成“uu”(TCL)吗

原始行:

CTS__94331/I (DCCKBD8BWP240H11P57PDULVT)     0.025      0.002 &    0.352 r
要求行:

CTS__94331/I_(DCCKBD8BWP240H11P57PDULVT)     0.025      0.002_&    0.352_r
我尝试了以下操作,但每个空格都替换为“”,我只需要1个空格替换为“”

regsub 1字词之间的空格至“\u1”

这种情况下,您可以考虑<代码>字符串映射< /代码>:

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

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

您需要在正则表达式中更巧妙地使用不同的替换

regsub -all {(\S)\s(?=\S)} $a {\1_}
正则表达式匹配(并捕获)一个后跟一个空格的非空白字符,然后要求(带有前瞻约束)下一个字符是一个非空白字符,而不匹配它。这将替换为匹配的第一个字符(替换为自身)和下划线


通常,对于这类事情,您会使用
\y\s\y
\uuu
,但这在您的用例中不起作用,因为它不能正确处理
0.002&
&
不是单词字符)


如果Tcl的RE-engine支持lookback约束(它不支持),这将更容易解决,因为您不需要将空格前的字符替换为空格本身。

删除
-all
?另外,您确定您的原始/所需行是正确的吗?如果只替换原始行中的空格,似乎不可能获得所需的行…这肯定比最初看起来更难。但将关键案例隐藏在页面边缘有点不公平,因为这很容易被忽略;我将长距离空格的宽度减小到了一个同等的问题。这将把所有空格替换为“ux”,并且我只想在任何字符之间替换1个空格。
regsub -all {(\S)\s(?=\S)} $a {\1_}