当一行与 VI 中整个文档的正则表达式匹配时,如何加入下一行?

Xia*_* Su 5 vim regular-expression

我有像

abcdefg
join!
abcdef
no join
abcdefg
join!
Run Code Online (Sandbox Code Playgroud)

如果一行与正则表达式匹配,^a.+g$那么我希望它们被加入,所以它是:

abcdefgjoin!
abcdef
no join
abcdefgjoin!
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点VIM

evi*_*oup 14

在正常模式下,J(不同于j,将光标向下移动一行)用于将一行与其正下方的行连接起来。但是,默认情况下,它会在第一行的末尾添加一个空格;要获得您想要的结果(在不插入额外空间的情况下加入行),必须使用gJ.

为了在 ex-mode 中使用 normal-mode 命令(:在正常模式下按 键进入),必须使用该normal命令。:h normal在 vim 中查看。因此,要使用与模式匹配的下一行,可以使用(请注意,默认情况下,您必须转义 the+才能使其与 vim 的正则表达式一起使用,这是与原始 vi 的古老正则表达式引擎保持兼容性的结果):

:/^a.\+g$/normal gJ
Run Code Online (Sandbox Code Playgroud)

要处理与模式匹配的每一行,可以像这样使用:global命令(参见:h :gvim 中):

:global/^a.\+g$/normal gJ
Run Code Online (Sandbox Code Playgroud)

或者,更简洁地说:

:g/^a.\+g$/norm gJ
Run Code Online (Sandbox Code Playgroud)

也可以使用 ex 命令join(请参阅 参考资料:h :join)以稍微减少输入的方式实现相同!的目的(在这种情况下,末尾告诉join不要在第一行的末尾插入空格)。

:g/^a.\+g$/join!
Run Code Online (Sandbox Code Playgroud)