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

use*_*191 8 vim

示例输入文件

+--------------------+---------+---------
|           Name     |   S1    |    S2
+--------------------+---------+---------
|           A        | -4.703  | -2.378  
|           B        | -3283.2 | -3204.5 
|           C        |  8779   |  7302   
|           D        |  22078  |  18018  
+--------------------+---------+---------
Run Code Online (Sandbox Code Playgroud)

需要删除S1列,即

期望的输出

+--------------------+---------
|           Name     |   S2    
+--------------------+---------
|           A        | -2.378    
|           B        | -3205.5  
|           C        |  7302      
|           D        |  18018    
+--------------------+---------
Run Code Online (Sandbox Code Playgroud)

有人能帮忙吗

谢谢

Tim*_*ote 3

在命令模式下:

:%s/^\([[+|][^+|]\+\)[+|][^+|]\+/\1/
Run Code Online (Sandbox Code Playgroud)

这使用了 vim 内置的类似 sed 的搜索和替换命令。详细情况如下:

%- 对于整个文件

s- 搜索

/^- 行的开头

\([[+|][^+|]\+\)- 后跟+or |,后跟任意数量的 ( )\+以外的任何内容 。这将获得我们想要保留的第一列,因此通过用 和 将其包围将其放入捕获组中+|\(\)

[+|][^+|]\+- 后跟+or |,后跟任意数量的 ( )\+以外的任何内容 。这将获得第二列,我们不想保留该列,因此没有捕获组。+|

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

就像我说的,vim 的正则表达式与 sed 几乎相同,所以如果你浏览一下关于 sed 的教程,你可能也会学到很多对 vim 有用的东西。

编辑

为了响应OP的要求,使其更普遍地能够删除任何列:

:%s/^\(\([[+|][^+|]\+\)\{1\}\)[+|][^+|]\+/\1/
Run Code Online (Sandbox Code Playgroud)

中的索引\{\}现在删除指示的列。将其视为数组索引(即从零开始)。现在\{0\}删除第一列,\{1\}删除第二列,依此类推。