vim - 删除选项卡之间的所有内容

时间:2011-03-04 15:18:33

标签: vim

我有一个包含制表符分隔数据的文件。我需要删除2列。那么,我可以使用哪些命令删除从当前选项卡到下一个选项卡的所有内容?

5 个答案:

答案 0 :(得分:5)

要删除第4列和第5列:

:%s/^\(.\{-}\t\)\{3}\zs.\{-}\t.\{-}\t//

说明:

^  => start of line

.\{−} => as few characters as possible
\( .\{-}\t \)\{3} => three times as few characters as possible followed with a tab

\zs => start of match

使用\v开关可以更清楚:

:%s/\v^(.{-}\t){3}\zs.{-}\t.{-}\t//

答案 1 :(得分:3)

我认为shift + ctrl + v正是您所寻找的。

http://jvi.sourceforge.net/javahelpset/jvi-vis_block.html

答案 2 :(得分:2)

这是否必须在vim中完成?如果你有一个unix命令行,我会选择旧的cut命令。例如,以下内容将保留第一列,包括&在第4次之后(丢弃2& 3)

cat filename | cut -d"\t" -f1,4- > outputfile

答案 3 :(得分:2)

虽然您可以使用正则表达式,但最好使用简单的ft普通命令:当您位于要删除的第一列的第一个字符时d2f<Tab>将删除此列和下一列,除非一列可以在其中包含换行符。如果可以的话,d2/<Tab>/e<CR>(或d2/\t/e<CR>)会做你想做的事。要在其他行上展开它,请使用宏:qaqqa01f<Tab>d2t<Tab>j@aq@a

  1. qaq:清除a注册(开始录制将存储在a寄存器中的宏,然后在键入其他内容之前立即停止录制);
  2. qa:开始在注册a;
  3. 中录制宏
  4. 0:转到该行的最开头;
  5. 1f<Tab>:跳转到下一个标签。此处可能会省略1。如果要删除第一列,则省略整个动作;
  6. d2t<Tab>:删除第二个下一个标签页;
  7. j:转到下一行;
  8. @a:运行存储在寄存器a中的宏。此时它是空的(因为它在第1项中被清除),所以实际上什么都没有;
  9. q:停止录制宏;
  10. @a:运行存储在寄存器a中的宏。它包含项目3.-7。在第7项中,它将自行运行。

答案 4 :(得分:1)

:%s:\t[^\t]\+\t:\t\t:

这会删除两个标签之间的所有内容。

HTH