仅在字母之间替换空格

7mo*_*od7 2 regex vim

我有一个包含数字和字母列的文件:

0.01182290 0.02526555 0.46794573 RING zinc finger protein putative 0105800 1076 1166 -90
Run Code Online (Sandbox Code Playgroud)

我想将字母之间的空格替换为下划线.

0.01182290 0.02526555 0.46794573 RING_zinc_finger_protein_putative 0105800 1076 1166 -90
Run Code Online (Sandbox Code Playgroud)

我是正则表达式的新手,替代字符串是[a-zA-Z]\s[a-zA-Z],但我无法确定替换是什么.我试过的一切都改变了空格之间的字母.

:%s/[a-zA-Z]\s[a-zA-Z]/??/g/
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 7

你可以用这个:

:%s/\v(\a)\s(\a)/\1_\2/g 
Run Code Online (Sandbox Code Playgroud)

这里的想法是使用捕获组并将其捕获的值放在输出中.


Ran*_*ris 5

一个更简单的替代方案是使用vim的匹配开始和匹配原子的结束(\zs\ze):

:%s/\a\zs\s\ze\a/_/g
Run Code Online (Sandbox Code Playgroud)

分解:

  • :%s/ - 开始整个文件的替换命令
  • \a - 简写 [A-Za-z]
  • \zs - 匹配字符串的开始
  • \s - 空格或标签
  • \ze - 匹配结束字符串
  • \a - 与上述相同
  • /_/ - 用一个替换匹配字符串 _
  • g - 对于线上的每次出现