为什么在这里每个字母后都添加行返回

时间:2019-12-26 02:43:02

标签: vim

我在文件中有以下文字:

a line




another line
new line

我正在尝试替换多个回车符,而仅用一个回车符替换它们。我正在尝试以下代码:

:%s/\v\n*/\r/g

但是,尽管上面的代码将多个空行替换为一个空行,但这也导致在每个字母之后添加回车符:

a

l
i
n
e
a
n
o
t
h
e
r

l
i
n
e
n
e
w

l
i
n
e

为什么会这样?

1 个答案:

答案 0 :(得分:2)

之所以这样做,是因为\n*表示任意数量的换行符,其中包括0个。

因此该模式实际上出现在每个字符对之间。更具体地说,在字符串ab中,ab之间实际上有零个更多的换行符(实际上,任何个字符零个或多个) 。这是因为“某物为零”是“某物为零或更多”的适当子集。

如果您使用\n+(表示一个或更多换行符),则它应该更接近您想要的内容:

a line
another line
new line

还可以通过使用vim之外的文本处理工具来达到类似的效果,例如:

sed '/^$/d' inputFile >outputFile

这是假设您要将多个换行符合而为一。

如果您打算将多条空白行合而为一,那么a lineanother line之间仍然有空白行,则应查看{{ 3}},我之前已经回答过。