置換テキストに数学を適用できるテキストエディターはありますか?


15

大きなXMLファイルがあります

<obj param="2542">
<obj param="2333">
<obj param="6433">

すべての「param」値をある数だけ増やす必要があります。多くのエディターで正規表現検索で必要な数字と一致させることができますが、置換に数学を適用する方法はありますか?


1
どのオペレーティングシステムですか?代わりにシェルスクリプトに満足しますか(これはかなり簡単です)。とにかく、私は確信しているvimemacsこの種のものを行うことができますが、それは、スクリプトを書くのではなく、単一のコマンドを使用して必要な場合があります。
狂気

窓の下で@frabjous。可能であれば何も書きません。しかし、シェルスクリプトを投稿すれば、多くの人に役立つと確信しています。
セルグ

回答:


18

少し調べてみると、vimはスクリプトを作成せずに1つのコマンドで実行できることがわかりました。たとえば、次のすべての数値に50を追加するには、次<obj param="を使用できます。

:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g

分解させてください。

: vimでコマンドラインモードを開始/指定する一般的な方法です。

%文書全体の範囲内を意味します。1,50代わりに、最初の50行内でそれを行うなど、番号範囲を設定できます。

s 代替の省略形です(必要に応じて単語全体を書くことができます)

@区切り文字です。探しているものに含まれていない限り、他の文字を使用できます。3回使用するだけです。(構文はに似ていsedます。)

デリミタ@の次の出現まではすべて、検索する正規表現パターンです。この場合は、任意の桁数であるが<obj param="続き\d\+ます。単一のREGの元のように後方参照にマッチするグループとして数字のこのシーケンス全体が設定している、またはVimのコマンド。\(\)\1submatch

次に、区切り文字@は、置換テキストとして続くものをマークします。

ここ\=での先頭にあるのは、ここで重要なreg exパターンまたは文字列ではなく、評価された式の結果を置き換えることです。

次に'<obj param="'、置換テキストの開始点があります。.次のこれは、文字列を連結するためのVimの機能です。

submatch(1) 置換コマンド内でのみ使用できるvim組み込み関数であり、正規表現と同じ文字列を返します \1submatch(2)正規表現\2などに相当するものに使用します。(\0一致したパターン全体ですが、ここでは必要ありません。)検索パターンの\(and \)は、としてカウントされるものをマークするために使用されsubmatch(1)ます。

したがって、検索パターンに(submatch(1) + 50)続く数字が<obj param="形成する数字に50を加算した結果が得られます。

区切り文字@は、置換テキストの終わりを示すために再び使用されます。

フラグgは、置換をグローバルにするために使用されます。各行の最初のインスタンスのみを置き換えたい場合は、これを省略できます。

おそらく、そこから異なる数値を追加する方法、減算する方法、除算する方法などを見つけることができます。


これはすばらしいことです。経度の値がまったく無効だったため、破損したGPXファイルがありました。幸運なことに、緯度は大丈夫だったので、マップを使用して最初の正しい値を計算し、いくつかの計算を行い、正しい値を得るために各値から4294.567548を引く必要があることがわかりました。私が持っていた唯一の障害は、このメソッドが浮動小数点数で動作しなかったことでした。そのため、小数点の両側を別々の置換として、1つは-4294と1つは-567548でした。
スタッフィング14年

7

Emacs(バージョン23以降):regexp replacement\,で任意のLispコードを実行するために使用します。たとえば、数字を2乗するには、次のようにします。

M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"

Vim:で置換テキストを開始します\=(を参照:help sub-replace-special)。たとえば、数値を二乗するには:

s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!

いくつかのエディターでは、マクロを使用してこのようなことを行うことができます。一致する数だけマクロを繰り返します。


過小評価された答え。短く、2人の編集者と一般的なケースをカバーします。
derekv

1

vimを使用してそれを行うことができます。ファイルを開いてマクロを記録するだけです。例:任意の番号を検索

/[0-9]{1,}

次に、qとa(レジスタaにマクロを保存)を押します。その後、Ctrl-X(数字を1ずつ増やす)を押し、その後n(次の検索結果用)を押します。それが終わったら、もう一度qを押してマクロを保存します。これで、@ + aを押して次の番号にマクロを適用できます。これにより、現在の番号が変更され、次の番号にジャンプします。それを繰り返すかx @ aを使用することで、それをx回繰り返すことができます。

まあ、その説明はそれがどのように行われるかを示すのに十分でないかもしれません。vimのマクロメカニズムを説明するチュートリアルを参照してください。


数を1ではなく100万ずつ変更する必要がある場合はどうなりますか?または、おそらく乗算/除算を使用しますか?
セルグ

1
すべての数値に定数xを追加するのは簡単です:x + Ctrl + a。別の番号を追加する必要がありますか?
evnu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.