Vim - 删除制表符之间的所有内容

3

我有一个包含制表符分隔数据的文件。我需要删除其中的两列。那么,我可以使用什么命令来删除当前制表符到下一个制表符之间的所有内容呢?

5个回答

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//

3

2

这个必须在vim中完成吗?如果你有Unix命令行,我建议使用老牌的cut命令。例如,以下命令将保留第一列和第四列及其后面的所有内容(删除第二和第三列)。

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

这是一个有用的答案,尽管在我的情况下,我只更改了一些行,所以它不起作用。 - David Oneill
@David Oneil:你可以将选定的一组行管道传输到外部命令。例如,:4,10!cut -d"\t" -f1,4- 将只会将第 4 行到第 10 行通过 cut 命令进行管道传输。 - rampion
@rampion:有没有一种方法可以说“从第10行开始到结束”? - David Oneill
@David Oneil:10,$!cut -d"\t" -f1,4- 将会给你从第 10 行到结尾($)的行,并且去掉第一列。 - Michael Berkowski

2
尽管您可以使用正则表达式,但最好使用简单的ft普通命令:当您处于要删除的第一列的第一个字符时,d2f<Tab>将删除这一列和下一列,除非其中一列可能包含换行符。如果可以,则d2/\t/e<CR>(或d2/\t/e<CR>)将实现您想要的效果。要在其他行上扩展它,请使用宏:qaqqa01f<Tab>d2t<Tab>j@aq@a
  1. qaq:清空a寄存器(开始记录将存储在a寄存器中的宏,然后立即停止记录以在键入任何其他内容之前);
  2. qa:开始记录在寄存器a中的宏;
  3. 0:跳转到该行的开头;
  4. 1f<Tab>:跳转到下一个制表符。这里可以省略1。如果要删除第一列,则省略整个动作;
  5. d2t<Tab>:删除到第二个下一个制表符;
  6. j:移动到下一行;
  7. @a:运行存储在寄存器a中的宏。此时它为空(因为在第1项中已清除),因此实际上什么也没做;
  8. q:停止记录宏;
  9. @a:运行存储在寄存器a中的宏。它包含项目3.-7.,在第7个项目中将运行自身。

耶,宏是前进的道路。 - Drasill

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

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

希望对你有所帮助。


我猜测这会在列的两侧留下制表符,我的理解正确吗? - David Oneill
是的,因为问题要求:删除从当前选项卡到下一个选项卡的所有内容。 - Zsolt Botykai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接