あなたが抱えている問題は、コマンドのパターン\1
ではなく、現在の置換の一致グループを参照することです。:g
残念ながら、以前の検索から以前の一致グループにアクセスすることはできません。ただし、目標を達成する方法はあります。最初にお勧めしたいのはマクロです。
まず、一致しない行から始めます。これは、必要に応じてファイルの先頭に空白行を挿入することで実行できます (後で削除するだけです)。
- パターンのマクロ検索を開始します。
/name_\d\+
- パターンの最後までヤンクします。
y//e
- 終了パターンを見つける:
/end/e
- アンダースコアを挿入する
a_
- で貼り付ける
p
- マクロを終了します
q
- 大きな数でマクロを実行します。例えば
999@q
使用したマクロは次のとおりです。
:let @q = "/name_\\d\\+\<cr>y//e\<cr>/end/e\<cr>a_\<esc>p"
もう 1 つの方法は:global
、試行と同様の方法でコマンドを使用することです。
:g/name_\d\+/let @@=matchstr(getline('.'),'name_\d\+')|/end/s//\=submatch(0).'_'.@@/
個人的にはこれはかなり複雑ですが、選択肢があるのはいいことです。コマンドは、次の部分に分けることができます。
:g/name_\d\+
name_ と数値に一致する各行でコマンドを実行します
getline('.')
現在の行の文字列を返します
matchstr(getline('.'), 'name_\d\+')
現在の行の一致する部分のみを返します
let @@ = matchstr(...)
一致した部分をデフォルトレジスタに設定します
/end/s/
:s
一致する次の行でa を実行しますend
s//\=.../
最後に使用されたパターンに一致し、express に置き換えます。
submatch(0).'_'.@@
一致したパターン全体の後にアンダースコアと名前のないレジスタの内容が続く文字列を作成します。
次のトピックの詳細については、次を参照してください。
:h q
:h search-offset
:h :g
:h :let-@
:h registers
:h matchstr(
:h getline(
:h range
:h submatch(