0

我在源文件中有一行:[12 13 15]. 在 vim 中,我输入:

:%s/\([0-90-9]\) /\0, /g

想在 12 和 13 之后添加一个昏迷。它可以工作,但不完全,因为它插入了一个 extraspace [12 , 13 , 15]

我怎样才能达到预期的效果?

4

3 回答 3

4

\1在替换表达式中使用,而不是\0.

\1是第一个捕获的文本\(...\)。如果您的模式中有更多的转义括号,将匹配从第二个、第三个等\2开始的对之间的文本捕获。\(\3\(

\0是与整个模式匹配的整个文本,无论是否在括号中。在您的情况下,这包括模式末尾的空格。

另请注意,[0-90-9]这与[0-9]: 每个[...]集合仅匹配一个字符相同。无论如何它都会起作用,因为在您的数据中,“一个数字后跟一个空格”与“2 个数字后跟一个空格”在相同的位置匹配。(如果你实际上只需要在 2 位数字后插入逗号,你可以写[0-9][0-9]。)

于 2013-01-24T13:46:14.743 回答
2

“我在源文件中有一行:...”

然后你输入:%s/...这将在所有行上进行替换,如果它匹配的话。或者那是你文件中的单行?

如果是单行,则不必分组,或者[0-9], 就:%s/ \+/,/g可以完成这项工作。

于 2013-01-24T13:52:08.510 回答
0

好的答案已经指出了有趣的解决方案,但这里有另一个解决方案,利用\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
于 2013-01-24T14:14:19.403 回答