web-dev-qa-db-ja.com

Vimを使用してパターンに基づいてテキストを複数の行に分割するにはどうすればよいですか?

次のテキストがあるとします。

name1 = "John"; age1 = 41;
name2 = "Jane"; age2 = 32;
name3 = "Mike"; age3 = 36;
...

そして、各行を2行に分割して、次のような結果を得る必要があります。

name1 = "John";
age1 = 41;
name2 = "Jane";
age2 = 32;
name3 = "Mike";
age3 = 36;
...

この操作をどのように自動化しますか?

いくつかのメモ:

  1. 私はすでに次の方法を試しました:
    (1)virtual-vodeのテキストを選択します。
    (2):'<,'>:norm ^3f r^M ***を実行し、
    しかし、正しく機能しません。すべての行が分割された後、コマンドの次の繰り返しが次の行ではなく、分割された行の残りの部分に適用されるため、行の半分だけが分割されます。
  2. これはマクロを使用して実現できますが、よりエレガントなソリューションを探しています。


***シーケンスの説明:

-norm通常モードで次のコマンドを実行する場合
-^カーソルを行の先頭に移動するため
-3f<space>カーソルを行の3番目のスペースに移動するため
-r^Mそのスペースを改行に置き換える

14
Ori Popowski

ファイル全体を操作するには、次を使用します。

:%s/; /;\r/

選択したテキストでのみを操作するには、次を使用します。

:'<,'>s/; /\r/

英語訳:

"セミコロンの後にスペースが続くwithセミコロンの後に改行が続く。 "

説明:

%    -    operate on the entire file
s    -    substitute
/    -    symbol that separates search/replace terms
;    -    the character you're searching for (notice I added a space)
;\r  -    the replacement text (semi-colon followed by newline)

これは、Viでの置換と同じくらい基本的なことです。


よりオタクのために:

このような状況では、実際に.vimrcファイルに次のマップがあります。

"
" add a newline after each occurrence of the last search term
"
nnoremap SS :%s//&\r/<CR>

このコマンドは、最後の検索パターンが最初に出現したときにファイルの各行を分割します。

したがって、ユースケースでは次のようにします。

  1. ;を検索します(スペースを含める場合と含めない場合があります...あなた次第です)
  2. 通常モードで次のコマンドを入力します:SS

ファイルの各行は、最初の;記号で分割されます。

明確にするために、次の5つのキーストロークを使用します。

/;ENTERSS

これは、XML、HTMLなどをすばやくフォーマットするのに非常に便利です...

31
jahroy