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


15

我的XML文件很大

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

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


1
什么操作系统?您会对Shell脚本感到满意吗(那很容易)?无论如何,我确定vim并且emacs可以做这种事情,但是可能需要编写脚本而不是使用单个命令。
frabjous

Windows下的@frabjous。我宁愿不写任何东西。但是,如果您发布Shell脚本,我相信它将对许多人有用。
serg

Answers:


18

经过一番摸索之后,事实证明,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用于使替换全局化;如果您只想替换每行的第一个实例,则可以忽略此设置。

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


太好了,我的GPX文件已损坏,因为经度值完全无效。幸运的是,纬度还可以,因此使用地图我可以算出第一个正确值应该是什么,进行一些数学运算,然后算出我需要从每个值中减去4294.567548才能正确处理。我唯一遇到的绊脚石是该方法不适用于浮点数,因此我只将小数点的每一侧都作了单独的替换,一个-4294和一个-567548。

7

在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.替换(必要时使用外部工具进行算术运算);重复宏,直到您有匹配项。


被低估的答案。简短,您涵盖了2位编辑+一般案例。
derekv'5

1

您可以使用vim为您做到这一点。只需打开文件并记录一个宏即可。示例:搜索任何数字

/[0-9]{1,}

然后按q和a(将宏存储在寄存器a中)。之后,按Ctrl-X(将数字增加1),然后按n(用于下一个搜索结果)。完成此操作后,再次按q保存宏。现在,您可以通过按@ + a将宏应用于下一个数字。这将更改当前号码,并跳至下一个号码。通过重复该操作或使用x @ a,您可以重复该操作x次。

好吧,该描述可能不足以显示如何完成。只需参考描述vim中宏机制的教程即可。


如果我需要将数字改为1而不是一百万怎么办?或者也许使用一些乘法/除法?
塞格2010年

1
如果要为每个数字添加一个常数x,则很容易:x + Ctrl + a。您是否需要添加其他数字?
evnu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.