16

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

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そのスペースを改行に置き換えるため

4

1 に答える 1

37

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

:%s/; /;\r/

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

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

英訳:

セミコロンの後にスペースが続く箇所はすべて、セミコロンと改行に置き換え ます。」

説明:

%    -    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 つのキーストロークを使用します。

/ ; ENTER S S

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

于 2013-07-16T02:41:25.863 に答える