我在源文件中有一行:[12 13 15]
。在vim中,我输入:
:%s/\([0-90-9]\) /\0, /g
希望在12和13之后添加昏迷。它可以工作,但不完全,因为它插入了一个额外空间[12 , 13 , 15]
。
如何达到预期效果?
答案 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