在vim中删除列

3
我希望使用vim删除文本文件的第一列。我阅读了这些堆栈溢出网站上的回答,它们使用可视模式,但它们只是删除了第一个字符(至于使用模式的答案,我不理解它们,因此我很难使它们适应我的情况)。我的文件包含许多数字,我想删除第一列中的数字,而不仅仅是第一个元素。

例:
12 34 43143 1
131234 1 
1 3443 132

I would like to have

34 43143 1
1 
3443 132

但目前,我得到
2 34 43143 1
31234 1 
 3443 132

数字之间用制表符分隔,如果有影响。

1
正则表达式怎么样? - Birei
@Birei,你能给我一个提示吗?谢谢。 - bigTree
如何使用 %s/\v^\d*\s//g,未经测试但应该有效。 - PKumar
请问您能否解释一下这些命令吗?(我想学习如何使用正则表达式) - bigTree
1
\v 代表非常魔法,它默认是关闭的,基本上不是默认设置。 \d 代表数字,* 代表0或多次,\s 代表空格,% 代表当前文件,%s 代表搜索当前文件,g 代表全局替换。顺便提一下,carret 代表文件开头。 - PKumar
5个回答

6

(Integer)数字在正则表达式语法中表示为[0-9],您也可以写成\d;由于有许多数字,因此附加了量词\+。制表符是\t,或者一般的空白字符是\s。现在,您想用空白替换/:substitute行开头(^)的数字。

:%s/^\d\+\t//
%将其应用于整个缓冲区,详见:help :range

以及更多

很快,您将想要删除不同的列;您可以断言某些匹配项(例如^\d\+\t\zs\d\+\t将选择第二列),或使用捕获组(甚至可以重新排序列!)但这会更加繁琐。
当你意识到你的文件格式被称为制表符分隔值时,突破就发生了,它是逗号分隔值的一种变体。有一个非常好的插件可以实现这一点(csv.vim - 用于csv文件的文件类型插件),它有一个:DeleteColumn命令-正是你需要的!(还有更多……)

6
这是一个需要使用cut命令的任务!
:%!cut -f 2-

3

测试这个:%s/\v^\d*\s//g,如果是制表符分隔的,可以将\s替换为\t

\v代表非常魔法(very magic),它没有默认打开,主要用于避免用斜杠掩盖小括号“(”)、花括号“{”等。 \d代表数字,“*”代表匹配次数为0或多次,\s代表空格,而“%”代表当前文件,“%s”代表搜索当前文件,“g”代表全局替换。顺便说一下,插入符号(^)代表行首,在这种情况下,您不必使用\vg,但我仍然会使用它们。

编辑:所以这个是完全没问题的:%s/^\d*\s//感谢Jeff

您可以使用vim帮助来查找类似内容。

:h \v
:h \d

e.t.c. 的正式定义如下:


1
这里不需要\v选项。如果省略这两个字符,它将起到相同的作用。 - Jeff
谢谢,我知道这并不是必要的,只是我的习惯而已。还是谢谢,我已经将它放在我的段落中了。 - PKumar

2
另一种选择是使用宏:

qq0dawjq

接下来你需要使用宏,格式为:@q 或者 3@q 或者任意数字 + @q

解释:

q: Start Recording a Macro
q: Save the macro in register q
0: Go to the beginning of the line
daw: Delete A Word
j: Move down to the next line
q: Finish the recording

1

你必须进行数据输入

:%s/\d\+\t//

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接