如何加入所有线路直到下一个条件?

时间:2014-05-27 14:07:20

标签: regex join vim lines

我无法找到如何加入所有行直到下一个条件发生(只有一个或多个数字的行)p.e。

输入:

1    
text text text text (with numbers)   
text text text text (with numbers)    
2
this text   
text text text text (with numbers)  
text text text  
3  
text text text text (with numbers)  
4  
etc  

desidered output:

1 text text text text (with numbers) text text text text (with numbers)    
2 this text text text text text (with numbers) text text text  
3 text text text text (with numbers)  
4  
etc

我通常使用global/^/,+2 join,但在上面的示例中,要加入的行数并不总是3。

3 个答案:

答案 0 :(得分:6)

而不是+2命令范围的静态:join端,只需指定仅包含数字(/^\d\+$/)的下一行的搜索范围,然后加入直到前一行(-1):

:global/^/,/^\d\+$/-1 join

答案 1 :(得分:5)

v/^\d\+/-j可以解决问题。

v为每个不符合条件的函数执行函数 ^\d\+您的情况:以数字开头的行。 -j向后退一行。或者,如果您希望使用上一个行加入当前行。

所以基本上我们将每个与你的条件不匹配的行加入前一行。

答案 2 :(得分:3)

正是由于Tim的评论认为它不能仅使用正则表达式搜索并使用Vim替换,我提出了这个:如何使用正则表达式搜索和替换,使用Vim:

:%s#\s*\n\(\d\+\s*\n\)\@!# #

如果您不喜欢反斜杠,可以使用"非常神奇的" \v

:%s#\v\s*\n(\d+\s*\n)@!# #

这是根据Tim在同一评论中给出的Perl风格正则表达式改编而来的,经过改进以确保"停止线"只有数字(也许是尾随空格)。

如果您对Perl感到满意并发现自己在使用Vim正则表达式方言时遇到问题,请参阅:help perl-patterns