我无法找到如何加入所有行直到下一个条件发生(只有一个或多个数字的行)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。
答案 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
。