たくさんのデータがあり、次の正規表現に一致するすべてのものをレジスターにヤンクしたいと思います。
/'user': '[a-Z]*'
すべての一致をVanillavimのレジスタにコピーする方法はありますか? この質問 を見てきましたが、1つの結果に対してのみ機能し、「n」を押して次の結果に移動した後、「// e」を再度使用して、最後に移動します。最初ではなく、次の結果。
this SO question 。これは私が探しているものとほぼ同じですが、動作するように変更する方法がわかりません。それらが存在する行の代わりに特定の一致。
これは、n
フラグを設定して:s
コマンドを実行することで簡単に実現できます(基本的には何も置き換えないようにします(ただし、置換部分で\=
を使用すると、まだ一致をキャプチャできます(:h sub-replace-special
を参照)。最初にレジスタAをクリアしましょう。
qaq
次に、以下を使用して、マッチをキャプチャしてレジスタに登録できます。
:%s/'user': '[a-Z]*'/\=setreg('A', submatch(0), 'V')/gn
そして、あなたのマッチを貼り付けます:
:put A
これには少なくともVim7.4が必要です(実際のパッチ番号を忘れました)。
"'a'レジスタをクリアします
qaq
"グローバル検索を行い、すべての行( 'A')を 'a'レジスタにヤンクします。
:g/'user': '[a-Z]*'/y A
必要に応じて、:g/ and /y A
の間の部分を変更します。
"別のファイルに貼り付けます
"aP
私の ExtractMatchesプラグイン から:YankMatches
コマンドを使用できます。
:%YankMatches /'user': '[a-Z]*'/
デフォルトでは、各一致は新しい行に配置されます。別のセパレーターを使用するには、別の形式があります。
おそらくもっと良い方法があります(非常に多くのエントリについて話している場合、これらは非効率的です-何千、何千も話していなければ問題ありません)が、最初に頭に浮かぶのは再帰マクロ。まず、wrapscanオプションをオンにして、ファイルの最後に到達する検索が再び最初にループしないようにします(そうしないと、無限ループになります)。
:set nowrapscan
次に、2つの明確なレジスタがあることを確認します。
qqq
qaq
さて、魔法:
qq/'user': '[a-Z]*'
"Ay//e
@qq
qq
はすべてのキーストロークの記録をレジスターq
に開始します。大文字を使用すると、vimは上書きされるのではなく、そのレジスタに追加されます。 y//e
検索の最後までヤンキーします。 @q
(現在空の)q
レジスタをマクロとして呼び出し、最後のq
は記録を停止します。次に、単純に:
@q