加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

regex – 如何:g /^$/,/./- j(减少多个空白行到一个空白)在vim

发布时间:2020-12-15 09:08:15 所属栏目:安全 来源:网络整理
导读:在文章 Vim Regular Expressions中,Oleg Raisky提供了以下命令将多个空白行缩减为一个空白: :g/^$/,/./-j 有人可以描述这是如何工作的吗? 我知道:g命令和正则表达式。但我不明白什么是/,/./-j的部分。 这真的很巧妙。让我们把它分解。 ex命令 g/^$/xyzzy
在文章 Vim Regular Expressions中,Oleg Raisky提供了以下命令将多个空白行缩减为一个空白:
:g/^$/,/./-j

有人可以描述这是如何工作的吗?

我知道:g命令和正则表达式。但我不明白什么是/,/./-j的部分。

这真的很巧妙。让我们把它分解。 ex命令
g/^$/xyzzy

将搜索所有空行并对其中的每一个执行xyzzy命令(任意ex命令)。

这里棘手的是,xyzzy命令在你的情况下是另一个替代命令:

,/./-j

,/。/ – 指定范围。这是< start>,< end>并且,因为逗号之前没有任何东西,它假设当前行(您找到空行的那一行)是开始。

逗号之后是/./-,这意味着搜索下一个字符(。表示任何字符),然后备份一行(/./-是/./-1的缩写,因为如果没有给出值,则暗示该字符) 。你会发现这种模式。在您操作的第一个非空行上。

换句话说,范围的结束是您当前操作的最后一个空行。

然后在该范围内执行连接。

如果范围的开始和结束相等(在段中只有一个空行),join不做任何操作。如果他们不相等,加入会加入他们。

这就是将多个空白行合并为一个的方式。

让我们看一个例子(行号不在文件中):

1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9

: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文档声明一个两遍算法,一个标记线,一个执行操作的事实。

我可能在这一点上错了(这不会是第一次),但它是一个实现细节,不影响功能。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读