各サブマッチを、各行の先頭で 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});