如何在Vim中删除指定符号后的文本

时间:2011-09-18 05:31:52

标签: vim

我的数据形式如下:

id|name|things that I don't care

因此,对于每一行,我想在第二个|符号后删除文本。

如何使用一个命令在Vim中执行此操作?

编辑:

在第二个|之后实际上有额外的管道,因为|被用作列的分隔符。

5 个答案:

答案 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,有效:

yeap

答案 4 :(得分:0)

:%s/[^|]*|[^|]*|\zs.*//

我们已经看到的变化。

匹配许多“不管道”后跟管道,两次。从第二个管道(\ zs)开始替换为空。