web-dev-qa-db-ja.com

vim:一意以外のすべての行を削除しますか?

VIMで、重複しているすべての行を削除し、ファイルに存在する一意の行のみを残す方法を探しています。マクロが望ましいですが、コマンドまたは関数は素晴らしいでしょう。

重複した行といくつかの一意のファイルがあるとします。

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

すべての行を削除して、すべてが残るようにします。

3Beer

私が本当に欲しい1つのユニークなライン。

重複を削除して一意のリストを取得するために常にsortuを使用していますが、ファイルに一意の行が必要な場合があります。

VIMでこのケースを処理する方法はありますか?

4
7null

これは、substituteコマンドと後方参照を使用して実行できます。

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

これは、行がソートされている場合にのみ機能することに注意してください。これは、次の行で最初のグループを1回以上照合して削除することで機能します。

6
Thor

これを行うには、「uniq」コマンドを使用できます-

 uniq -u filename-to-check.txt 
4
davidgo
  1. フィルタリングするすべての行を選択します。

  2. :'<,'>!uniq -u<CR>を実行すると、'<,'>の範囲が自動的に追加されます。

バッファ全体をフィルタリングする場合は、何も選択せずに:%!uniq -u<CR>を実行します。

フィルタについては、:h filterで読むことができます。

2
romainl

uniqツールをフィルターとしてVimから直接呼び出すことができます。

:!%uniq -u
1
Ingo Karkat