Regex 如何连接所有线路直到下一个条件?
直到下一个条件发生(只有一个或多个数字的行)p.e.我才知道如何连接所有行 输入:Regex 如何连接所有线路直到下一个条件?,regex,join,vim,lines,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 设计输出
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
设计输出:
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。v/^\d\+/-j
就可以了
v
为每个不匹配的条件执行函数
^\d\+
您的条件:以数字开头的行。
-j
将连接向后移动一行。或者,如果希望将当前行与前一行合并
因此,基本上,我们将所有与前一行条件不匹配的行连接起来。而不是
+2
命令范围的静态:join
结束,只需为下一行指定一个只包含一个数字的搜索范围(/^\d\+$/
),然后连接到前一行(-1
):
正是因为Tim的评论,即使用Vim仅使用正则表达式搜索和替换是无法完成的,我提出了以下内容:如何使用Vim仅使用正则表达式搜索和替换:
:%s#\s*\n\(\d\+\s*\n\)\@!# #
如果您不喜欢反斜杠,可以使用“非常神奇”的方法简化它:
:%s#\v\s*\n(\d+\s*\n)@!# #
这是根据同一条评论中给出的Tim的Perl风格正则表达式改编而成的,改进后的正则表达式确保“停止行”只有数字(可能还有尾随的空格)
如果您熟悉perl,并且发现自己在使用Vim正则表达式方言时遇到问题,请参阅
:帮助perl模式。Vim只支持POSIX样式的正则表达式,不支持lookaround-因此,如果必须使用Vim,那么它就不能单独使用正则表达式。如果您可以使用其他编辑器,则很容易:将\s*\n(?!^\d)
替换为一个空格。这个问题很好,有示例数据、所需输出和尝试的步骤。这值得投票@tim您假设解决这个问题的唯一方法是使用lookaround,然后vim没有lookaround regexp。这两种假设都是错误的,很有趣。vim my Google搜索的regex文档只包含POSIX。但是,是的,也可以不用周围的人。我太悲观了。应该注意的是,这并没有正确地加入最后一节。请注意@mb14 solutionWorks很好。它返回一个错误(E16:无效范围),但它仍然执行我想要的操作。Tnx。(感谢向上投票)当没有下面的数字行时,抛出错误。这是可以避免的,但会使命令更加复杂。如果这适合您的数据(并且您可以在末尾临时添加另一个数字),请忽略它。
:%s#\v\s*\n(\d+\s*\n)@!# #