示例输入文件
+--------------------+---------+---------
| 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)
有人能帮忙吗
谢谢
在命令模式下:
:%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\}删除第二列,依此类推。