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

Der*_*ang 11 vim

我的数据形式如下:

id|name|things that I don't care
Run Code Online (Sandbox Code Playgroud)

所以对于每一行,我想在第二个|符号后删除文本.

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

编辑:

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

Joh*_*web 19

一个解决方案

:%s!^\([^|]*|\)\{2\}\zs.*!!
Run Code Online (Sandbox Code Playgroud)

说明:

  • %:在每一行
  • 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
Run Code Online (Sandbox Code Playgroud)

之后:

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| 
Run Code Online (Sandbox Code Playgroud)


ib.*_*ib. 11

可以简单地重复正常模式命令,该命令跳转到第二个|符号旁边的字符并删除直到每行的行尾.

:%norm!2f|lD
Run Code Online (Sandbox Code Playgroud)