我有一个包含制表符分隔数据的文件。我需要删除其中的两列。那么,我可以使用什么命令来删除当前制表符到下一个制表符之间的所有内容呢?
我有一个包含制表符分隔数据的文件。我需要删除其中的两列。那么,我可以使用什么命令来删除当前制表符到下一个制表符之间的所有内容呢?
删除第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//
这个必须在vim中完成吗?如果你有Unix命令行,我建议使用老牌的cut
命令。例如,以下命令将保留第一列和第四列及其后面的所有内容(删除第二和第三列)。
cat filename | cut -d"\t" -f1,4- > outputfile
f
或t
普通命令:当您处于要删除的第一列的第一个字符时,d2f<Tab>
将删除这一列和下一列,除非其中一列可能包含换行符。如果可以,则d2/\t/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个项目中将运行自身。:%s:\t[^\t]\+\t:\t\t:
这将删除两个标签之间的所有内容。
希望对你有所帮助。
:4,10!cut -d"\t" -f1,4-
将只会将第 4 行到第 10 行通过 cut 命令进行管道传输。 - rampion10,$!cut -d"\t" -f1,4-
将会给你从第 10 行到结尾($
)的行,并且去掉第一列。 - Michael Berkowski