我的数据形式如下:
id|name|things that I don't care
因此,对于每一行,我想在第二个|
符号后删除文本。
如何使用一个命令在Vim中执行此操作?
编辑:
在第二个|
之后实际上有额外的管道,因为|
被用作列的分隔符。
答案 0 :(得分:18)
一个解决方案:
:%s!^\([^|]*|\)\{2\}\zs.*!!
说明:
%
:每一行s
:替代!
:模式开始^
:行首\(
:小组开始[^|]*
:任意数量的非管道字符|
:后跟管道\)
:小组结尾\{2\}
:匹配该组的两个计数\zs
:在此处开始匹配模式.*
:任何字符!
:模式结束和替换开始!
:替换结束这将使不到两个管道的线路保持不变,并且还将处理具有两个以上管道的线路......
<强>之前强>
id name things that I don't care no pipes
id|name things that I don't care one pipe
id|name|things that I don't care two pipes
id|name|things that I don't care extra pipe at line end|
id|name|things that I don't care | extra pipe mid-line
id|name|things that I don't| care| two extra pipes
name|things that I don't care missing first column and pipe
|name|things that I don't care missing first column
<强>后强>:
id name things that I don't care no pipes
id|name things that I don't care one pipe
id|name|
id|name|
id|name|
id|name|
name|things that I don't care missing first column and pipe
|name|
答案 1 :(得分:11)
可以简单地重复正常模式命令,该命令跳转到下一个字符
到第二个|
符号并删除,直到每个符号的行尾
线。
:%norm!2f|lD
答案 2 :(得分:1)
如果“不关心”部分没有管道,那么
:%s/|[^|]*$/|/
还处理空的“不关心”部分。如果你在“不关心”部分之前添加新字段,它会继续工作。
答案 3 :(得分:0)
我会做类似的事情:
%s/\(.*|.*|\).*/\1
Yeap,有效:
答案 4 :(得分:0)
:%s/[^|]*|[^|]*|\zs.*//
我们已经看到的变化。
匹配许多“不管道”后跟管道,两次。从第二个管道(\ zs)开始替换为空。