4

各サブマッチを、各行の先頭で 1 から始まるインクリメント インデックスを持つ文字列に置き換えて、置換文字列がvarargin{1}varargin{2}varargin{3}などになるようにします。より大きな数値の場合、数値文字列には当然複数の文字が必要になります。例: varargin{9}varargin{10}など。入力データは MATLAB コードです。入力例と必要な出力を以下に示します。私は主に Vim ソリューションを探していますが、これを行う他の方法も高く評価されています。

以下の正規表現は、1 から始まる実行中のインデックスを作成しますが、それらは行ごとに変わります。

:let @a=1 | %s/\v.*'\zs.*\ze\);/\=substitute(submatch(0), '\s[a-zA-Z0-9{}_.]*', ' varargin{'.(@a+setreg('a',@a+1)).'}', 'g')/g

私の質問は:

各行の先頭でインデックスを 1 にリセットし、サブマッチごとにインデックスを 1 ずつ増やすにはどうすればよいですか?

上記のコードは、http : //vim.wikia.com/wiki/Substitute_with_incrementing_numbersに示されている「昇順の数字で置換」の例の修正版です。

:let @a=1 | %s/abc/\='xyz_'.(@a+setreg('a',@a+1))/g

入力例 #1:

messages.msg1.English = xprintf('analysis directory is on %s\n', analysis_dir);

入力例 #1 の望ましい出力:

messages.msg1.English = xprintf('analysis directory is on %s\n', varargin{1});

入力例 #2:

messages.msg15.English = xprintf('the following sessions (%d pcs) have been approved: %s', handling_struct.n_of_accepted, handling_struct.accepted_sessions_vector);

入力例 #2 の望ましい出力:

messages.msg15.English = xprintf('the following sessions (%d pcs) have been approved: %s', varargin{1}, varargin{2});

入力例 #3:

messages.msg19.English = xprintf('looking for files ''%s'' in %d separate dirs', give_file_struct.regex, number_of_dirs);

入力例 #3 の望ましい出力:

messages.msg19.English = xprintf('looking for files ''%s'' in %d separate dirs', varargin{1}, varargin{2});
4

2 に答える 2

4

この場合、次のコマンドを使用します。

:g/^/let n=[0] | s/abc/\='xyz_'.map(n,'v:val+1')[0]/g

「<a href="https://stackoverflow.com/q/7366430/254635">Vim で CSV の列区切りを番号付きラベルに置き換える方法は?」という質問に対する私の回答も参照してください。

于 2012-11-11T18:45:38.713 に答える
1

これはハックな解決策かもしれませんが、関数なしでこれをすばやく実行したい場合は、次のようにします。

:let i=1<cr>                                         "set the index variable
qbf lcEvarargin{<C-r>=i<cr>},<esc>:let i+=1<cr>q     "record a macro
u                                                    "undo those changes
:%norm$F':let i=1<C-v><C-j>1000@b<cr>                "run the macro on each line
:%s/,$/);/<cr>                                       "clean up

<>特別なキーを表すために vim の表記法を使用していることに注意してください。つまり、<cr>改行を<C-r>意味し、CTRL-R を意味します (「参考文献」を参照:h i_CTRL-R)。は、コマンド ラインに<C-v><C-j>リテラル文字を入力します。^@これにより、コマンドを終了せずに通常モードで「Enter キーを押す」ことができます。:normここではマクロの代わりに使用:normします。これは、エラーがスローされたときに次の行に移動するだけだからです。マクロがエラーをスローすると (たとえばft、行に t がないときに実行しようとすると)、完全に失敗します。このようにして、マクロを 1000 回実行し、失敗したら動き続けることができます。繰り返しますが、おそらく最もエレガントな解決策ではありませんが、うまくいき、私の怠惰が通常勝ちます。

于 2012-11-11T18:01:01.433 に答える