大きなXMLファイルがあります
<obj param="2542">
<obj param="2333">
<obj param="6433">
すべての「param」値をいくらか増やす必要があります。多くのエディターで正規表現検索を使用して必要な数値を照合できますが、置換に数学を適用するにはどうすればよいですか?
もう少し突っ込んだ後、vimはスクリプトを使わずに1つのコマンドでそれを実行できることがわかりました。たとえば、_<obj param="
_に続くすべての数値に50を追加するには、次を使用できます。
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
それを分解させてください。
_:
_は、vimでコマンドラインモードを開始/指定する一般的な方法です。
_%
_は、ドキュメント全体の範囲内を意味します。 _1,50
_などの数値範囲を入力して、代わりに最初の50行以内に入力することもできます。
s
は代用の省略形です(必要に応じてWord全体を書き出すことができます)
_@
_は区切り文字です。探しているものに含まれていない限り、他の文字を使用できます。 3回使用するだけです。 (構文はsed
に似ています。)
区切り文字@が次に出現するまでのすべてが、検索する正規表現パターンです。この場合、_<obj param="
_の後に_\d\+
_が続きます。これは任意の桁数です。 _\(
_と_\)
_は、この数字のシーケンス全体を、_\1
_やvimのsubmatch
コマンドなどの後方参照に一致する単一の正規表現グループとして設定するためにあります。
次に、区切り文字_@
_は、次のものが置換テキストであることを示します。
ここで始まる_\=
_は、ここで重要な正規表現のパターンや文字列ではなく、評価された式の結果を置き換えることを意味します。
次に、置換テキストの開始に_'<obj param="'
_があります。次の_.
_は、文字列を連結するためのvimの関数です。
submatch(1)
は、置換コマンド内でのみ使用できるvim組み込み関数であり、正規表現_\1
_と同じ文字列を返します。正規表現の_\2
_などと同等のsubmatch(2)
を使用します。 (_\0
_は完全に一致するパターンですが、ここでは必要ありません。)検索パターンの_\(
_と_\)
_は、submatch(1)
。
したがって、_(submatch(1) + 50)
_は、検索パターン形式の_<obj param="
_に続く数字の数に50を加算した結果を示します。
区切り文字_@
_は、置換テキストの終わりをマークするために再び使用されます。
フラグg
は、置換をグローバルにするために使用されます。各行の最初のインスタンスのみを置き換えたい場合は、これを省略できます。
おそらくそこから、さまざまな数値を加算する方法、減算する方法、除算する方法などを理解できます。
Emacsの場合(バージョン23以降):\,
を使用して、 正規表現置換 で任意のLISPコードを実行します。たとえば、使用できる数値を2乗するには
M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"
Vimの場合:置換テキストを\=
で開始します(:help sub-replace-special
を参照)。たとえば、数値を2乗するには:
s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!
いくつかのエディターでは、マクロを使用してこの種のことを実行できます。1。次の一致を検索し、2。置換を実行するマクロを定義します(必要に応じて外部ツールを使用して算術演算を実行します)。一致する回数だけマクロを繰り返します。
あなたはあなたのためにそれをするためにvimを使うことができます。ファイルを開いて マクロ を記録するだけです。例:任意の番号を検索する
/[0-9]{1,}
次に、qとaを押します(マクロをレジスタaに格納します)。その後、Ctrl-X(1ずつ増やします)を押し、その後n(次の検索結果)を押します。それが終わったら、もう一度qを押してマクロを保存します。これで、@ + aを押すことにより、マクロを次の番号に適用できます。これにより、現在の番号が変更され、次の番号にジャンプします。それを繰り返すか、x @ aを使用することで、そのx回を繰り返すことができます。
まあ、その説明はそれがどのように行われるかを示すのに十分ではないかもしれません。 vimのマクロメカニズムを説明するチュートリアルを参照してください。