Vim正则表达式替换问题

3

我想在VIM中将所有多个“-”字符(从行首开始)替换为“=”

例如,用“=====”替换“-----”
或用“========”替换“----------”

我创建了这个正则表达式:

%s/^-\{2,}/=  ????/g

有人知道我如何复制“=”替换吗?(在“=”后面要放什么)
3个回答

5

试试这个:

:%s/^-\{2,}/\=substitute(submatch(0), '-','=','g')/

或者:

:%s/^-\{2,}/\=repeat('=',len(submatch(0)))/

请查看:help sub-replace-\=以获取更多详细信息。


2

我相信还有更好的答案,但从实际角度考虑,为了简单起见,我会把这个问题分成两个独立的操作:

%s/--/==/g
%s/=-/==/g

首先替换所有的双重出现,将-----变成====-。然后使用第二个方法修复剩余的=-。不过,如果有更优雅的解决方案,我会很乐意看到的。

2

从技术角度来说,%s/-/=/g可以完成任务,但是它会在整个文件中的每一个-都进行替换。

如果你想要替换的行确实以-开头,我会这样做:

g/^-/s/-/=/g

或者,如果在第一个-之前有一些空格:
g/^\s*-/s/-/=/g

剩下的问题出现在这样的行中:
----------- the-composite-word

他们变成了:
=========== the=composite=word

为了解决这个问题,有很多方法。我不是那位大师可以提出一种非常通用的方法,但这可能适用于单词之间的破折号:
g/^-/s/\w\@<!-/g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接