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