加入不匹配的行

时间:2011-12-07 11:40:05

标签: vim join

我正在尝试加入所有没有匹配的线路

示例文字:

text Like   
This is text of Line2  
This is text of Line3  
This is text of line4  
Like text  
This is text of line6  
This is text of line7  
Like  
This is text of line9  

“Like”不存在的所有行必须连接(它们之间有空格)

最终结果:

text Like   
This is text of Line2 This is text of Line3 This is text of line4  
Like text  
This is text of line6 This is text of line7  
Like  
This is text of line9  

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

首先摆脱你的尾随空格:

:%s/\s\+$

现在可以加入以下几行:

:v/Like/normal VnkJ

哪个应该是不言自明的。在每行不包含“Like”的行上, 进入视觉直线模式,搜索下一个“喜欢”行(它重复使用 先前的模式),一起去加入。

答案 1 :(得分:2)

:%v/Like/.,/Like/-1j

如果您只想要以Like开头的行,请改用^ Like。 如果你想摆脱尾随空格,就像sidyll写的一样。

代码意味着:

 % for all lines
 v that do not match /Like/
 ., do from the current line (aka the (not) matching line)
 /Like/-1 To the line bevor the next line matching /Like/
 j join.

由于这更容易理解并且看起来更好,我只需在此处添加补充版本:

$s/$/^MLike/|exec '%v/Like/.,/Like/-1j'|$d

它有以下内容:

$s/$/^MLike/

以^ M为实际回报(通过^ Vreturn完成) 这一行最后添加了一个“赞”,以防万一你没有

exec '...'

执行v-line并保护最后一个|从被包括在重复中

$d

再次删除添加的“赞”。

答案 2 :(得分:1)

我会使用以下命令。

:v/Like/,/\n.*Like\|\%$/j