2012-05-17 103 views
6

我想删除两列之间所有行的内容。我该怎么做呢?如何从两列之间的所有行中删除文本?

例如,我想这一点:

abcdefg 
hijklmn 
opqrstu 

要成为这一点,如果我通过去除5列3之间的文本:在d

abfg 
himn 
optu 
+0

对于所有行,或只是当前行? – Jeremy

+0

对于所有行,我也想知道第80行到第90行 –

+0

我用一个例子更新了你的问题。你能确定它是准确的吗?你关心的数字是无关紧要的。 – Jeremy

回答

15

将光标,然后按Ctrl-VlG and d

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

最好先做'G'然后'l',因为如果'G'让你在空行上,你可能必须重做'l'。 – Lumi

+0

不错,但不幸的是,在vim 7.4.903+中,'G'将选择扩展到文件底部和文件左侧。因此在原始示例中,所有字符都将被移除到左侧。相反,您需要使用'l'键确保突出显示的区域是您想要移除的区域。 – timbo

4

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

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

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

您可以使用搜索和替换:

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

或更一般的形式:

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

其中第一个数字(2)是该列的索引(基于零),第二个数字(3)是该列所具有的字符数。

说明:

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

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

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

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

HTH

+0

您的解决方案是基于字符的,而不是基于列的。这对于双宽度(例如中文)字符和不可打印字符(例如^ P(CTRL-P))有所不同。 –

+0

@IngoKarkat你是对的。我没有读完你的全部答案(我在阅读CTRL-V后停止了)。 +1为您的答案。 – Tassos

4

你提的问题是非常相似的this one

要删除的列3至5为所有行上的文件中:

:%normal 3|d6| 

为了删除一个特定的线的间隔(80〜90),使用:

:80,90normal 3|d6| 

如果您不熟悉普通命令和| | “运动”有云的简单说明:

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

我会做下列方式:

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

将在开始删除一切除了前两列,两底。

相关问题