私は次のような行があります
abcdefg
join!
abcdef
no join
abcdefg
join!
行が正規表現に一致する場合^a.+g$
次に、それらを結合したいので、次のようにします。
abcdefgjoin!
abcdef
no join
abcdefgjoin!
VIM
でそれを行う方法はありますか?
通常モードでは、J
(カーソルを1行下に移動するj
とは異なります)を使用して、行をそのすぐ下の行と結合します。ただし、デフォルトでは、最初の行の終わりにスペースが追加されます。必要な結果を得るには(スペースを追加せずに行を結合する)、gJ
を使用する必要があります。
Exモード(通常モードで:
を押して入力)で通常モードコマンドを使用するには、normal
コマンドを使用する必要があります。 vim内の:h normal
を参照してください。したがって、パターンに一致する次の行を操作するには、次を使用します(デフォルトでは、元のviとの互換性を維持した結果、vimの正規表現で機能させるために+
をエスケープする必要があります。古代正規表現エンジン):
:/^a.\+g$/normal gJ
パターンに一致するevery行を処理するには、次のように:global
コマンド(vim内の:h :g
を参照)を使用します。
:global/^a.\+g$/normal gJ
または、より簡潔に:
:g/^a.\+g$/norm gJ
Exコマンドjoin
(:h :join
を参照)を使用して、タイピングをわずかに少なくして同じことを達成することもできます(最後の!
、この場合、join
最初の行の終わりにスペースを挿入しないでください)。
:g/^a.\+g$/join!
「純粋な」正規表現ソリューションは次のようになります。
:%s/^\(a.\+g\)\n/\1/
それが持つ利点は、それを使用してターゲット行から目的の文字列を抽出し、それを次の行と組み合わせることができることです。たとえば、末尾の空白を削除します
:%s/^(a.\+g\)[ \t]\+\n/\1/