私は次のコマンドが動作するはずだと思う:
:%s/^\(.*\)\(\n\1\)\+$/\1/
説明 :
ファイル全体で代用コマンドを使用して、次のように変更pattern
しstring
ます。
:%s/pattern/string/
ここpattern
に^\(.*\)\(\n\1\)\+$
ありstring
ます\1
。
pattern
このように分解することができます:
^\(subpattern1\)\(subpattern2\)\+$
^
そして、$
それぞれ行頭と行末に一致します。
\(
そして、後で特別な番号で参照できる\)
ように囲むsubpattern1
ために使用され\1
ます。量指定子で1回以上繰り返すことができるように、
囲みにも使用されます。subpattern2
\+
subpattern1
is .*
.
は、改行を除く任意の文字に一致するメタ文字であり*
、最後の文字に0回、1回以上一致する数量詞です。
したがって.*
、改行を含まないテキストと一致します。
subpattern2
された\n\1
\n
新しい行を一致し、\1
最初の内側にマッチした同じテキストと一致し\(
、\)
ここにありますsubpattern1
。
だから、pattern
このように読むことができます:
行の先頭(^
)新しい行を(含まない任意のテキストに続く.*
)改行(続く\n
)その後、同じテキスト(\1
)、後者の2つのビーイングは、(1回以上繰り返す\+
)、および最後に行末($
)。
どこpattern
(同じラインのブロック)と一致している、置換コマンドは、に置き換えstring
ここでこれは\1
(ブロックの最初の行)。
ファイル内で何も変更せずに影響を受ける行ブロックを確認したい場合は、hlsearch
オプションを有効にしてn
、コマンドの最後に置換フラグを追加できます。
:%s/^\(.*\)\(\n\1\)\+$/\1/n
よりきめ細かな制御を行うには、c
代わりに置換フラグを追加して、行の各ブロックを変更する前に確認を求めることもできます。
:%s/^\(.*\)\(\n\1\)\+$/\1/c
置換コマンドの読み取りの詳細については:help :s
、
置換フラグのため:help s_flags
、
様々なメタ文字と数量を読むために:help pattern-atoms
、
とのためのvimの正規表現は読み、これを。
編集:ワイルドカード$
はを末尾に追加することでコマンドの問題を修正しましたpattern
。
また、BloodGainには、同じコマンドのより短くて読みやすいバージョンがあります。
$
ただし、コマンドにはそれが必要です。それ以外の場合、前の行と同じテキストで始まる行で予期しないことを行いますが、他の末尾の文字があります。また、あなたが与えた基本的なコマンドは:%!uniq
、私の回答と機能的に同等ですが、ハイライトと確認フラグは素晴らしいことに注意してください。