Regex :g/^$/,/./-j(将多个空行减少为一个空行)如何在vim中工作?
在本文中,Oleg Raisky给出了以下命令,将多个空行减少为一个空行:Regex :g/^$/,/./-j(将多个空行减少为一个空行)如何在vim中工作?,regex,vim,Regex,Vim,在本文中,Oleg Raisky给出了以下命令,将多个空行减少为一个空行: :g/^$/,/./-j 有人能描述一下这是怎么回事吗 我知道:g命令和正则表达式。但是我不明白/,/./-j的作用 它真的很有创意。让我们把它分解一下。ex命令 g/^$/xyzzy 将搜索所有空行,并对每一行执行xyzy命令(任意ex命令) 这里比较棘手的一点是,在您的例子中,xyzy命令是另一个替代命令: ,/./-j ,/./-指定一个范围。这是格式>代码> ,因为在逗号之前没有任何东西,它假定当前行(找到
:g/^$/,/./-j
有人能描述一下这是怎么回事吗
我知道
:g
命令和正则表达式。但是我不明白/,/./-j
的作用 它真的很有创意。让我们把它分解一下。ex
命令
g/^$/xyzzy
将搜索所有空行,并对每一行执行xyzy
命令(任意ex
命令)
这里比较棘手的一点是,在您的例子中,xyzy
命令是另一个替代命令:
,/./-j
,/./-
指定一个范围。这是格式>代码> <代码>,因为在逗号之前没有任何东西,它假定当前行(找到空白行的那一行)是开始。< /P>
逗号是/./-
后,表示搜索下一个字符(
表示任何字符),然后备份一行(/./-
是/./-1
的缩写,因为如果未给出值,则表示该行)。您将在正在操作的模式后面的第一个非空行中找到该模式
换言之,范围的末尾是您当前操作的范围之后或处的最后一个空行
然后在该范围内执行联接
如果范围的起点和终点相等(节中只有一个空行),则join不执行任何操作。如果他们不平等,join将把他们全部联合起来
这就是它将多个空行合并为一个空行的方式
让我们看一个例子(行号不在文件中):
:g
命令将查找所有空行并对其执行操作(第2、5、6、7和8行)
对于第2行,,/./-j
将设置从2到2的范围(下一个
在第3行找到,然后减去1)。范围2,2上的联接不起任何作用
对于第5行,,/./-j
将设置从5到8的范围(接下来在第9行找到
,然后减去1)。范围为5,8的连接将所有这些线连接在一起
我不完全确定这一点,但我认为该操作可能不会在作为早期操作一部分而消失的线路上执行。这是因为处理在周期早期删除的行是没有意义的
换句话说,由于删除了第6行到第8行(与第5行合并),因此在此之后全局命令不会对它们进行操作。我认为这仅仅是基于这样一个事实,即vim文档说明了一个双过程算法,一个用于标记行,一个用于执行操作
在这一点上我可能错了(这不是第一次),但这是一个不会影响功能的实现细节。谢谢。这非常清楚。我不知道:g的“XYZ命令”部分可以指定一个范围。XYZ命令可以是任何
ex
命令,包括另一个替代命令。我想,如果你想对vim知识进行更疯狂的测试,你可以将其中的一些串在一起:-)太棒了!前几天我还在想办法加入多个ex命令。。谢谢。我自己刚刚试过这个命令,很快发现它有一个小缺陷:由于它的工作方式,文件末尾的多个空行不会合并!(这是因为“.”没有匹配的内容。)这是一个很好的观点@Tom,但这是命令本身的问题,而不是我的答案:-)我已经考虑过如何最好地修改它来处理这两种情况,但还没有提出任何建议。
1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9