如何在Vim中删除第二列?


12

我有一个制表符分隔的文件,例如:

name1   verb1   name2   verb2   etc...

我想删除第二列。我尝试编辑以下答案之一,但不熟悉sedand awk,我做不到。

谁能帮我?


@KasiyA OP的原始\ t表示制表符。
钢铁司机

@steeldriver好的,您是对的。我认为这是行的一部分。删除。但我根据编辑,以正确的第一篇文章 .thanks
αғsнιη

1
vim可视块模式不能解决问题?(在正常模式下按Ctrl-V,选择该列,x以删除)?
Rmano 2014年

@Rmano可以帮助您,但是您能告诉我如何在可视模式下转到文件末尾吗?(我试过ctrl G,但不起作用)。
teaLeef 2014年

Answers:


10

在vim中,您应该可以使用以下命令

:%s/\t[^\t]*//

(替换TAB后,零个或多个字符出现,除非TAB没有字符)。如果你的文件只有两列,你可以使用一个稍微简单:%s/\t.*或者:%s/\t.*$其替代第一TAB任何以下字符到行的末尾。


22

公认的答案比这个要优雅得多(我赞成!),但是如果您不记得它,可以直接使用vim 可视块模式。打开vim并转到(普通模式)列的第一个角,如下所示:

在此处输入图片说明

键入,CTRL-V然后您可以移动光标以选择列,这是中间的过程:

在此处输入图片说明

要结束,请按G

在此处输入图片说明

该块似乎已损坏,因为我们在最后一行空白处;只需向上一行(使用向上箭头或k)再次查看...:

在此处输入图片说明

现在,您只需按一下x即可删除该块:

在此处输入图片说明


6

我会用cut这个

cut -f1,3- file.txt > newfile.txt
mv newfile.txt file.txt

您也可以在vim中将其用作过滤器(这将替换文件中的所有行;您也可以使用(例如)2,9代替%处理2-9行,或使用来选择所需的行V):

:%!cut -f1,3-

-f1,3-表示“打印第一字段,然后打印第三字段以及所有字段,直到行末”。默认情况下,cut使用制表符作为分隔符;如果您还需要其他东西,请使用-d选项(请参阅man cut)。


4

您可以尝试:

:%norm WdW

或使用视觉模式手动:

  1. 跳到第二列(例如,按:)W
  2. 开始视觉遮挡Ctrl+v
  3. 选择第二列(例如,按:WG)。
  4. 按删除它d

要从命令行就地执行此操作,请尝试:

$ ex +':exe ":%norm f\<Tab>dE"' -scx file

相关:如何为Tab键编写用于运动的文字?

也可以看看:


是的,+ 1,但是请注意,如果在步骤3)末尾有空白行,可能会出错...
Rmano
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.