如何在vim中更换

时间:2013-01-24 13:43:22

标签: vim

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

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

希望在12和13之后添加昏迷。它可以工作,但不完全,因为它插入了一个额外空间[12 , 13 , 15]

如何达到预期效果?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

  

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

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

如果是单行,则不必进行分组,或[0-9]只需:%s/ \+/,/g即可完成此任务。

答案 2 :(得分:0)

精美的答案已经指出了有趣的解决方案,但这是另一个, 利用\zs,标志着比赛的开始。在这种模式中:

/[0-9]\zs /

搜索到的文字为/[0-9] /,但只有空格才算作匹配。注意 您可以使用类\d来简化数字字符类,所以 以下命令可以满足您的需求:

:s/\d\d\zs /, /g  ; matches only the space, replace by `, '

您说您有多行,这些更改仅适用于某些行。 您可以直观地选择要更改的行或使用:global command,用于搜索与模式匹配的行并应用命令 他们。现在,您需要构建一个表达式来匹配要更改的行 以尽可能不太精确的方式。如果以可选开头的行 空格,[和两位数是唯一要匹配的行而不是其他行 那些,那么这对你有用:

:g/\s*[\d\d/s/\d\d\zs /, /g

查看\ze的{​​{1}}及类似内容的帮助 pattern.txt


家庭作业:使用帮助来了解\zs并了解其工作原理:

:s/\d\d\zs\ze /,/g