在VIM中删除重复模式的行

Dur*_*tta 0 regex vim

我有一个文件,每行的格式为: - x,y,z - 其中x,y,z都是数字.例如

10, 10, 1
10, 11, 2.0
455, 42, 12
Run Code Online (Sandbox Code Playgroud)

我想删除前两个数字相等的那些行.我该怎么做呢?

FDi*_*off 6

使用全局命令捕获第一个数字,如果第二个数字相同,它将匹配正则表达式.

:g/\v(-?\d+(\.\d+)?),\s\1,/d
Run Code Online (Sandbox Code Playgroud)

或者没有非常神奇

:g/\(-\?\d\+\(\.\d\+\)\?\),\s\1,/d
Run Code Online (Sandbox Code Playgroud)

正则表达式的解释.

  • \v 在vim中打开非常神奇
  • ( 开始正则表达式捕获/反向引用
  • -? 可选的减号
  • \d+ 匹配任何数字1次或更多次(由反向引用捕获)
  • (\.\d+) 可选的小数部分
  • ) 结束正则表达式捕获
  • , 匹配逗号
  • \s 匹配某种形式的空白
  • \1 匹配在第一个反向引用中捕获的相同模式(在这种情况下是第一个数字)(即确保数字相同
  • , 确保数字延伸到下一个逗号

:g对于:global与正则表达式匹配的每一行执行ex命令后,它都是短的.在这种情况下的命令是d删除该行.

:g/regex/cmd 
Run Code Online (Sandbox Code Playgroud)

看看:h :g:h pattern-searches