twitter youtube tumblr flickr rss mail

category: computer

[正規表現] 重複行を削除する(ソートなしで)


本記事のタイトルとURL をコピーする

例えば以下のような、重複する行があるテキストがあるとする。

あああ
いいい
ううう
いいい
いいい
ううう
ううう
ううう
えええ
あああ
おおお
いいい

このテキストから重複行を消したいんだけど、その際、初回に出現するフレーズのみ残して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 と入力することで、最終結果を取得できる。


書籍