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
用于使替换成为全局;如果您只想替换每行上的第一个实例,则可以省略此项。
您可能可以从那里计算出如何添加不同的数字,或减去或除以等。
在 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. 执行替换(如有必要,使用外部算术工具);根据匹配项重复宏多次。
归档时间: |
|
查看次数: |
5223 次 |
最近记录: |