我在源文件中有一行:[12 13 15]
. 在 vim 中,我输入:
:%s/\([0-90-9]\) /\0, /g
想在 12 和 13 之后添加一个昏迷。它可以工作,但不完全,因为它插入了一个 extraspace [12 , 13 , 15]
。
我怎样才能达到预期的效果?
我在源文件中有一行:[12 13 15]
. 在 vim 中,我输入:
:%s/\([0-90-9]\) /\0, /g
想在 12 和 13 之后添加一个昏迷。它可以工作,但不完全,因为它插入了一个 extraspace [12 , 13 , 15]
。
我怎样才能达到预期的效果?
\1
在替换表达式中使用,而不是\0
.
\1
是第一个捕获的文本\(...\)
。如果您的模式中有更多的转义括号,将匹配从第二个、第三个等\2
开始的对之间的文本捕获。\(
\3
\(
\0
是与整个模式匹配的整个文本,无论是否在括号中。在您的情况下,这包括模式末尾的空格。
另请注意,[0-90-9]
这与[0-9]
: 每个[...]
集合仅匹配一个字符相同。无论如何它都会起作用,因为在您的数据中,“一个数字后跟一个空格”与“2 个数字后跟一个空格”在相同的位置匹配。(如果你实际上只需要在 2 位数字后插入逗号,你可以写[0-9][0-9]
。)
“我在源文件中有一行:...”
然后你输入:%s/...
这将在所有行上进行替换,如果它匹配的话。或者那是你文件中的单行?
如果是单行,则不必分组,或者[0-9]
, 就:%s/ \+/,/g
可以完成这项工作。
好的答案已经指出了有趣的解决方案,但这里有另一个解决方案,利用\zs
,它标志着比赛的开始。在这种模式下:
/[0-9]\zs /
搜索到的文本是/[0-9] /
,但只有空格算作匹配。请注意,您可以使用该类\d
来简化数字字符类,因此以下命令将满足您的需要:
:s/\d\d\zs /, /g ; matches only the space, replace by `, '
您说您有多条线路,而这些更改仅针对某些线路。您可以直观地选择要更改的行或使用:global
命令,该命令搜索与模式匹配的行并将命令应用于它们。现在您需要构建一个表达式以尽可能不精确地匹配要更改的行。如果以可选空格、a 和两位数字开头的行 [
是唯一要匹配的行,而没有其他行,那么这对您有用:
:g/\s*[\d\d/s/\d\d\zs /, /g
查看 pattern.txt 的 帮助\ze
和类似的 和
:global
。
作业:使用帮助来理解\zs
并查看其工作原理:
:s/\d\d\zs\ze /,/g