任何可以将一些数学应用于替换文本的文本编辑器?

ser*_*erg 15 search regex text-editors

我有很大的 XML 文件

<obj param="2542">
<obj param="2333">
<obj param="6433">
Run Code Online (Sandbox Code Playgroud)

我需要将所有“参数”值增加一些数字。我可以在许多编辑器中使用正则表达式搜索匹配我需要的数字,但是如何将一些数学应用于替换?

fra*_*ous 18

经过一番探索之后,事实证明 vim 可以使用单个命令来完成,而无需编写脚本。例如,要将 50 添加到以下所有数字中,<obj param="您可以使用:

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

让我分解一下。

: 是在 vim 中进入/表示命令行模式的一般方法。

%指在整个文件的范围内;您可以放入一个数字范围,例如,1,50只在前 50 行内进行。

s 是替代品的简写(如果您愿意,可以写出整个单词)

@是分隔符;您可以使用任何其他字符,只要它不在您要搜索的内容中即可。用三遍就好了。(语法类似于sed.)

直到下一次出现分隔符 @ 的所有内容都是要搜索的 reg ex 模式,在这种情况下,<obj param="后跟\d\+,它是任意数量的数字。该\(\)在那里设置的位数这整个序列作为一个REG前组,其将匹配像反向引用\1,或Vim的submatch命令。

然后分隔符将后面的内容@标记为替换文本。

\=一开始这里手段来代替一些计算的表达式的结果,而不是一个reg前图案或字符串,其在这里是关键。

然后我们'<obj param="'开始替换文本。在.这下面是Vim的用于连接字符串函数。

submatch(1)是一个 vim 内置函数,只能在替换命令中使用,并返回与正则表达式相同的字符串\1;您将submatch(2)用于相当于正则表达式\2等。(\0是整个匹配的模式,但我们不希望在这里。)的\(\)在搜索模式用来标记过什么算作submatch(1)

因此(submatch(1) + 50)给出了将 50 添加到<obj param="搜索模式形式中的数字后面的数字的结果。

分隔符@再次用于标记替换文本的结尾。

该标志g用于使替换成为全局;如果您只想替换每行上的第一个实例,则可以省略此项。

您可能可以从那里计算出如何添加不同的数字,或减去或除以等。


Gil*_*il' 7

在 Emacs 中(自版本 23 起):用于\,regexp replacement 中执行任意 Lisp 代码。例如,要平方您可以使用的数字

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

在 Vim 中:用\=(见:help sub-replace-special)开始你的替换文本。例如,要对数字进行平方:

s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!
Run Code Online (Sandbox Code Playgroud)

有几个编辑器允许你用宏来做这样的事情:定义一个宏,1. 寻找下一个匹配,2. 执行替换(如有必要,使用外部算术工具);根据匹配项重复宏多次。