web-dev-qa-db-ja.com

行がVIのドキュメント全体の正規表現と一致する場合、次の行に参加するにはどうすればよいですか?

私は次のような行があります

abcdefg
join!
abcdef
no join
abcdefg
join!

行が正規表現に一致する場合^a.+g$次に、それらを結合したいので、次のようにします。

abcdefgjoin!
abcdef
no join
abcdefgjoin!

VIMでそれを行う方法はありますか?

5
Xiaoge Su

通常モードでは、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!
12
evilsoup

「純粋な」正規表現ソリューションは次のようになります。

:%s/^\(a.\+g\)\n/\1/

それが持つ利点は、それを使用してターゲット行から目的の文字列を抽出し、それを次の行と組み合わせることができることです。たとえば、末尾の空白を削除します

:%s/^(a.\+g\)[ \t]\+\n/\1/
1
Jeff