Answers:
经过一番摸索之后,事实证明,vim可以使用单个命令来完成操作,而无需编写脚本。例如,要对以下所有数字加50,<obj param="
可以使用:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
让我分解一下。
:
是在vim中进入/指定命令行模式的一般方法。
%
指在整个文件范围内;您可以输入一个数字范围,例如,1,50
仅在前50行内执行。
s
是替代的简写(如果愿意,您可以将整个单词写出来)
@
是定界符;您可以使用其他任何字符,只要它不在您要搜索的字符中即可。只需使用它三次。(语法类似于sed
。)
直到下一个定界符@出现的所有内容都是要搜索的正则表达式模式,在这种情况下,<obj param="
其后是\d\+
,可以是任意数字位数。该\(
和\)
在那里设置的位数这整个序列作为一个REG前组,其将匹配像反向引用\1
,或Vim的submatch
命令。
然后,定界符@
将以下内容标记为替换文本。
在\=
一开始这里手段来代替一些计算的表达式的结果,而不是一个reg前图案或字符串,其在这里是关键。
然后我们'<obj param="'
开始替换文本。在.
这下面是Vim的用于连接字符串函数。
submatch(1)
是vim的内置函数,只能在替换命令中使用,并返回与regex相同的字符串\1
;您将使用submatch(2)
正则表达式的等价物\2
。(\0
是整个匹配的模式,但我们不希望在这里。)的\(
和\)
在搜索模式用来标记过什么算作submatch(1)
。
因此,(submatch(1) + 50)
得出的结果是,将50乘以<obj param="
搜索模式形式后跟的数字。
分隔符@
再次用于标记替换文本的结尾。
该标志g
用于使替换全局化;如果您只想替换每行的第一个实例,则可以忽略此设置。
您可能可以从那里算出如何将不同的数字相加,相减或相除等。
在Emacs(版本23起)中:用于\,
执行regexp替换中的任意Lisp代码。例如,将数字平方即可
M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"
在Vim中:使用开始您的替换文本\=
(请参阅:help sub-replace-special
)。例如,将数字平方:
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中宏机制的教程即可。
vim
并且emacs
可以做这种事情,但是可能需要编写脚本而不是使用单个命令。