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

vim-删除制表符之间的所有内容,vim,Vim,我有一个包含制表符分隔数据的文件。我需要删除2列。那么,我可以使用什么命令删除从当前选项卡到下一个选项卡的所有内容?要删除第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 fol

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

要删除第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是您需要的

这将删除两个选项卡之间的所有内容


HTH

是否必须在vim中执行此操作?如果您有一个unix命令行,我会使用旧的
cut
命令。例如,以下内容将保留第一列以及第四列之后的所有内容(丢弃2和3)


虽然可以使用正则表达式,但最好使用简单的
f
t
普通命令:当您位于要删除的第一列的第一个字符处时,
d2f
将删除此列和下一列,除非其中一列可以包含换行符。如果可以,则
d2//e
(或
d2/\t/e
)将执行您想要的操作。要在其他行上展开它,请使用宏:
qaqqa01fd2tj@aq@a

  • qaq
    :清除
    a
    寄存器(开始录制将存储在
    a
    寄存器中的宏,然后在键入任何其他内容之前立即停止录制)
  • qa
    :开始在寄存器
    a
    中记录宏
  • 0
    :转到行的最开头
  • 1f
    :跳到下一个选项卡<此处可省略代码>1。如果要删除第一列,则忽略整个运动
  • d2t
    :删除到第二个下一个选项卡
  • j
    :移动到下一行
  • @a
    :运行存储在寄存器
    a
    中的宏。此时它是空的(因为它在第1项中被清除),所以实际上什么都没有做
  • q
    :停止录制宏
  • @a
    :运行存储在寄存器
    a
    中的宏。它包含项目3-7。在第7项中,它将自动运行

  • 我认为这会在列的两侧留下制表符,对吗?是的,因为问题是:删除从当前制表符到下一个制表符的所有内容。这是一个有用的答案,尽管在我的例子中,我只是更改了一些行,所以它不起作用。@David Oneil:您可以将选定的行集通过管道传输到外部命令。例如
    :4,10!cut-d“\t”-f1,4-
    将通过cut命令仅输送第4行到第10行。@rampion:有没有办法说“从第10行开始到结束”?@David Oneil
    :10,$!剪切-d“\t”-f1,4-
    将为您提供到末尾的第10行(
    $
    )所有宏都是可行的。
    :%s:\t[^\t]\+\t:\t\t:
    
    cat filename | cut -d"\t" -f1,4- > outputfile