我有一个包含制表符分隔数据的文件。我需要删除2列。那么,我可以使用哪些命令删除从当前选项卡到下一个选项卡的所有内容?
答案 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正是您所寻找的。 p>
答案 2 :(得分:2)
这是否必须在vim中完成?如果你有一个unix命令行,我会选择旧的cut
命令。例如,以下内容将保留第一列,包括&在第4次之后(丢弃2& 3)
cat filename | cut -d"\t" -f1,4- > outputfile
答案 3 :(得分:2)
虽然您可以使用正则表达式,但最好使用简单的f
或t
普通命令:当您位于要删除的第一列的第一个字符时d2f<Tab>
将删除此列和下一列,除非一列可以在其中包含换行符。如果可以的话,d2/<Tab>/e<CR>
(或d2/\t/e<CR>
)会做你想做的事。要在其他行上展开它,请使用宏:qaqqa01f<Tab>d2t<Tab>j@aq@a
:
qaq
:清除a
注册(开始录制将存储在a
寄存器中的宏,然后在键入其他内容之前立即停止录制); qa
:开始在注册a
; 0
:转到该行的最开头; 1f<Tab>
:跳转到下一个标签。此处可能会省略1
。如果要删除第一列,则省略整个动作; d2t<Tab>
:删除第二个下一个标签页; j
:转到下一行; @a
:运行存储在寄存器a
中的宏。此时它是空的(因为它在第1项中被清除),所以实际上什么都没有; q
:停止录制宏; @a
:运行存储在寄存器a
中的宏。它包含项目3.-7。在第7项中,它将自行运行。答案 4 :(得分:1)
:%s:\t[^\t]\+\t:\t\t:
这会删除两个标签之间的所有内容。
HTH