使用Visual Block模式删除VIM / gvim中的特定列

时间:2012-05-09 11:07:58

标签: vim

示例输入文件

+--------------------+---------+---------
|           Name     |   S1    |    S2
+--------------------+---------+---------
|           A        | -4.703  | -2.378  
|           B        | -3283.2 | -3204.5 
|           C        |  8779   |  7302   
|           D        |  22078  |  18018  
+--------------------+---------+---------

需要删除S1列,即

期望输出

+--------------------+---------
|           Name     |   S2    
+--------------------+---------
|           A        | -2.378    
|           B        | -3205.5  
|           C        |  7302      
|           D        |  18018    
+--------------------+---------

任何人都可以帮忙解决这个问题。

感谢

5 个答案:

答案 0 :(得分:4)

看,ma:没有视觉(块)模式

我的实用方法胜利是:寻找列锚(-+-

/-+-

现在,列删除就像

一样简单
d<C-v>N

(逐块删除,从文档末尾开始下一次出现的列锚)。

完成工作。


花式选项

要考虑多个列,您需要准确了解要匹配的列

这需要一点点额外的魅力

0 ˚F +
  :exec '/\%' . col('.') . 'v\v[+|]' 输入
  名词 C-V 名词
   + d

要了解有关选择虚拟列的\%22v方式的更多信息,请参阅

答案 1 :(得分:3)

在命令模式下:

:%s/^\([[+|][^+|]\+\)[+|][^+|]\+/\1/

这使用了vim内置的类似sed的搜索和替换命令。这是细分:

% - 对于整个文件

s - 搜索

/^ - 行的开头

\([[+|][^+|]\+\) - 后跟+|,后跟任何 \+的任何数字(+) }或|。这将获得我们要保留的第一列,因此请将其放在捕获组中,方法是将其包围\(\)

[+|][^+|]\+ - 后跟+|,后跟任何 \+的任何数字(+) }或|。这将得到我们不想保留的第二列,因此没有捕获组。

/\1/ - 替换我们与第一个捕获组(包含第一列)匹配的所有内容。这有效地将第一列和第二列替换为第一列的内容。

就像我说的那样,vim的正则表达式与sed非常相似,所以如果你查看this tutorial on sed,你可能会为vim找到很多有用的东西。

修改

响应OP的要求,使其更通常能够删除任何列:

:%s/^\(\([[+|][^+|]\+\)\{1\}\)[+|][^+|]\+/\1/

\{\}内的索引现在删除指示的列。可以把它想象成一个数组索引(即从零开始)。因此,\{0\}现在删除第一列,\{1\}删除第二列,依此类推。

答案 2 :(得分:3)

我想将 Mathias Schwarz 的评论写入答案中,因为Visual Mode是完成任务的自然方式,尽管已经有了接受的答案。

假设光标位于¶

+--------------------+¶--------+---------
|           Name     |   S1    |    S2  
+--------------------+---------+---------
|           A        | -4.703  | -2.378  
|           B        | -3283.2 | -3204.5 
|           C        |  8779   |  7302   
|           D        |  22078  |  18018  
+--------------------+---------+---------

使用普通命令 Ctrl-V 8jf+d选择S1列并将其删除。说明:

  • Ctrl-V :以分块视觉模式进入。
  • 8j :Eigth是表格的行数,它将光标设置在同一列但最后一行。
  • f + :将光标移动到下一个+字符。
  • d :删除视觉选择。

结果是:

+--------------------+---------
|           Name     |    S2
+--------------------+---------
|           A        | -2.378  
|           B        | -3204.5 
|           C        |  7302   
|           D        |  18018  
+--------------------+---------

答案 3 :(得分:2)

如果这是文件的唯一内容,最简单的方法是使用它:

:%normal 22|d32|

如果文件中有更多文本,请指定行间隔:

:X,Ynormal 22|d32|

其中X和Y是行间隔,例如:10,17normal 22|d32|

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

  1. normal命令在正常模式下执行以下命令;
  2. | “motion”将光标移动到指定的列,因此22|将光标移动到第22列;
  3. 基本上:X,Ynormal 22|d32|的作用是将光标移动到第22列(22|)并删除所有内容(d),直到第32列(32|)为<由X和Y指定的strong>每一行

答案 4 :(得分:0)

根据表格的模式,可以通过两个简单的命令来实现:

:%norm 2f+dF+
:%norm 2f|dF|

要移除2的列,1将移除1st,3 - 3rd)。

如下所示(对于每一行):

  1. F ind列的第二个相应字符(2f+2f|)。
  2. D 向后退到列的下一个 f 字符(dF+dF|)。
  3. 这是命令行方法就地删除第二列:

    $ ex +'%norm 2f+dF+' +'%norm 2f|dF|' -scx cols2