【发布时间】:2011-03-04 15:18:32
【问题描述】:
我有一个包含制表符分隔数据的文件。我需要删除 2 列。那么,我可以使用什么命令来删除从当前选项卡到下一个选项卡的所有内容?
【问题讨论】:
标签: vim
我有一个包含制表符分隔数据的文件。我需要删除 2 列。那么,我可以使用什么命令来删除从当前选项卡到下一个选项卡的所有内容?
【问题讨论】:
标签: vim
删除第 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//
【讨论】:
我认为 shift+ctrl+v 就是你要找的。p>
【讨论】:
这必须在 vim 中完成吗?如果你有一个 unix 命令行,我会选择旧的 cut 命令。例如,以下将保留第一列,以及第四列之后的所有内容,包括 & (丢弃 2 和 3)
cat filename | cut -d"\t" -f1,4- > outputfile
【讨论】:
:4,10!cut -d"\t" -f1,4- 将通过 cut 命令仅通过管道传输第 4 到 10 行。
:10,$!cut -d"\t" -f1,4- 会给你第 10 行到最后 ($)
虽然您可以使用正则表达式,但最好使用简单的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 中的宏。此时它是空的(因为它在第一项中被清除),所以实际上什么也没做;q:停止录制宏;@a:运行存储在寄存器a 中的宏。它包含项目 3.-7。在第 7 项中,它将自行运行。【讨论】:
:%s:\t[^\t]\+\t:\t\t:
这会删除两个选项卡之间的所有内容。
HTH
【讨论】: