示例输入文件
+--------------------+---------+---------
| 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
+--------------------+---------
任何人都可以帮忙解决这个问题。
感谢
答案 0 :(得分:4)
我的实用方法胜利是:寻找列锚(-+-
)
/-+-
现在,列删除就像
一样简单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
列并将其删除。说明:
+
字符。结果是:
+--------------------+---------
| 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|
如果您不熟悉正常命令并且不熟悉| “动议”有一个快速的解释:
normal
命令在正常模式下执行以下命令; 22|
将光标移动到第22列; 基本上: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)。
如下所示(对于每一行):
2f+
或2f|
)。dF+
或dF|
)。这是命令行方法就地删除第二列:
$ ex +'%norm 2f+dF+' +'%norm 2f|dF|' -scx cols2