👋

[vim] 重複行の抽出

2021/06/11に公開

ソート済みのテキストから重複行の抽出がしたかったので、vimで対応

" 重複行は連続で2行まで。
aa
bbb
ccc
cccc
dddddddd
dddddddd
eeeeeeee
eeeeeeee
eeeeeeee.txt
eeeeeeee.txt
fff
fff
ddd
↓
dddddddd
eeeeeeee
eeeeeeee.txt
fff

以下で実施できます。

:v/\(^.*$\)\n\1$/delete

行っていることとしては

  1. \(^.*$\) 該当行の文字列をキャプチャ
  2. \nで改行を検索
  3. \1でキャプチャした文字列で検索
  4. :v/<pattern>/<cmd> でpatternと一致しない行に対してcmd実行。今回のケースだとdeleteを実行し行削除。

です。たまにしか出番ないけど、置換ではなく検索で \1 使えるのとっても便利。
本当は重複行が3行以上連続するテキストにも対応したかったけど、この方法で抽出した行に対して sort u すればよいので、とりあえずOKです。

参考

:h /\(
:h /\n
:h /\1
:h :v
:h :delete

Discussion