[正規表現] 重複行を削除する(ソートなしで)
例えば以下のような、重複する行があるテキストがあるとする。
あああ
いいい
ううう
いいい
いいい
ううう
ううう
ううう
えええ
あああ
おおお
いいい
このテキストから重複行を消したいんだけど、その際、初回に出現するフレーズのみ残して2回目以降の出現分を削除したい。すなわち以下のような結果になるようにしたい。
あああ
いいい
ううう
えええ
おおお
別の言いかたをすると、初回出現の順番を取得したいということである。お分かりいただけただろうか。
普通にググると、一旦テキストをソートした上で、正規表現を使って連続する重複行を削除する、という方法は見つかる。しかし<ソートをせずに>重複行を削除する方法を見つけるのに苦労した。最終的には以下のページが参考になった。
6-3 出現回数が2回目以降なら削除その2
https://oraclesqlpuzzle.ninja-web.net/regex/regex-6-3.html
環境:macOS、Sublime Text アプリ(テキストエディタ)
(0)Sublime Text アプリに対象のテキストを入力する。
(1)command + option + f で置換用ボックスを出す。そして、以下のように入力する。
Find: \n
Replace: |
control + option + return と入力することで、テキストが一旦縦棒(|)で区切られた1行のテキストになる(Sublime Text は正規表現での置換ができる状態にしておく)。
(2)文末に縦棒(|)が入力されていない場合、手入力で追記しておく。
(3)再び command + option + f で置換用ボックスを出す。そして、以下のように入力する。
Find: (^|\|)([^|]+\|)(.*\|)?\2
Replace: \1\2\3
(4)テキストが置換されなくなるまで、「command + option + f」と「control + option + return」の入力を繰り返す。
(5)command + option + f で置換用ボックスを出す。そして、以下のように入力する。
Find: \|
Replace: \n
control + option + return と入力することで、最終結果を取得できる。