vim:删除所有行但不删除唯一行?

vim:删除所有行但不删除唯一行?

我在 VIM 中寻找一种方法来删除所有重复的行,只保留文件中存在的唯一行。我更喜欢宏,但命令或函数也很好。

假设我有一个包含重复行和一些唯一行的文件:

1Apple
1Apple
2Peach
2Peach
2Peach
3Beer
4Banana
4Banana
4Banana

我想删除所有行,以便只剩下:

3Beer

我真正想要的那条独特的线。

我总是使用 sort u 来通过删除重复项来获取唯一列表,但有时我只需要文件中的唯一行。

有什么想法如何在 VIM 中处理这种情况?

答案1

您可以使用替代命令和反向引用来执行此操作:

s/^\(.*\)\(\n\1\)\+//

请注意,这仅在行已排序时才有效。这通过在下一行中匹配并删除第一组一次或多次来实现。

答案2

您可以使用“uniq”命令来执行此操作 -

uniq -u 要检查的文件名.txt

答案3

您可以uniq直接从 Vim 调用该工具作为过滤器:

:!%uniq -u

答案4

  1. 选择所有想要过滤的行。

  2. 这样做:'<,'>!uniq -u<CR>'<,'>范围会自动为您添加。

如果您想要过滤整个缓冲区,请不要选择任何内容,只需执行:%!uniq -u<CR>

您可以阅读有关过滤器的信息:h filter

相关内容