8

我想删除两列之间所有行的内容。我该怎么做呢?

例如,我想要这个:

abcdefg
hijklmn
opqrstu

如果我删除第 3 列到第 5 列之间的文本,就会变成这样:

abfg
himn
optu
4

5 回答 5

18

将光标置于 d 中,然后按Ctrl-Vl和。Gd

  • Ctrl-v进入视觉阻挡模式;
  • l将视觉选择向右扩展一个字符;
  • G将选择扩展到最后一行;
  • d删除选择。
于 2012-05-17T19:23:19.740 回答
8

您的问题与此问题非常相似。

要删除文件中所有行的第3 到 5 列:

:%normal 3|d6|

要删除特定的行间隔(80 到 90),请使用以下命令:

:80,90normal 3|d6|

如果您不熟悉普通命令也不熟悉 | “运动”有一个快速的解释:

  1. normal命令在正常模式下执行以下命令;
  2. 该| "motion" 将光标移动到指定列,因此3|将光标移动到第 3 列;
  3. 然后我删除所有内容 ( d) 直到第 5 列 ( 6|)。
于 2012-05-18T13:17:51.523 回答
4

对于自发编辑,我会通过 CTRL-V(通常映射到 Windows 上的 CTRL-Q)使用分块可视模式,然后d将其删除。

如果你经常这样做,对于一个大范围/整个缓冲区,或者重复,我会使用一个在虚拟列中开始匹配的替换,并延伸(向上)到最后一列,就像你的例子:

%s/\%3v.*\%<7v//
于 2012-05-17T19:29:08.427 回答
3

您可以使用搜索和替换:

:%s/..\zs...\ze

或更一般的形式:

:%s/.\{2}\zs.\{3}\ze

其中第一个数字 (2) 是列的索引(从零开始),第二个数字 (3) 是该列的字符数。

解释:

:%s/在整个缓冲区中搜索和替换。

.\{2}\zs找到两个字符并在此处设置匹配的开头。

.\{3}\ze找到三个字符并在此处设置匹配结束。

省略替换字符串,因为您要删除匹配项。

高温高压

于 2012-05-18T07:26:35.280 回答
0

我会按照以下方式进行:

:%s/^..\zs.*\ze..$//g

这将在开始时删除前两列和最后两列之外的所有其他内容。

于 2015-10-18T13:02:51.690 回答