如何从两列之间的所有行中删除文本?

时间:2012-05-17 18:35:59

标签: vim

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

例如,我想要这个:

abcdefg
hijklmn
opqrstu

如果我删除第3列到第5列之间的文字,那就成为了这个:

abfg
himn
optu

5 个答案:

答案 0 :(得分:17)

将光标放在d中,然后按 Ctrl-V l G d

  • Ctrl-v 进入视觉区块模式;
  • l 将视觉选择扩展到右侧一个字符;
  • G 将选择范围扩展到最后一行;
  • d 删除选择。

答案 1 :(得分:4)

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

如果你经常这样做,对于大范围/整个缓冲区,或者反复,我会使用在虚拟列中开始匹配的替换,并将(向上)扩展到结束列,就像你的例子: / p>

%s/\%3v.*\%<7v//

答案 2 :(得分:4)

您的问题与this one非常相似。

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

:%normal 3|d6|

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

:80,90normal 3|d6|

如果您不熟悉正常命令,也不熟悉| “动议”有一个快速的解释:

  1. normal命令在正常模式下执行以下命令;
  2. | “motion”将光标移动到指定的列,因此3|将光标移动到第3列;
  3. 然后我删除所有内容(d)直到第5列(6|)。

答案 3 :(得分:3)

您可以使用搜索和替换:

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

或以更一般的形式:

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

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

说明:

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

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

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

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

HTH

答案 4 :(得分:0)

我会按以下方式做:

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

将删除开头前两列的所有其他内容,最后两列。