Vim 搜索替换正则表达式 + 增量函数

Vim search replace regex + incremental function

我目前陷入 vim 试图找到一个 search/replace oneliner 来用另一个数字替换一个数字 + 每次新迭代的增量 = 当它找到一个新的匹配时。

我正在使用 xml svg 代码批处理文件 Inkscape 无法处理文本(纯 svg 多行文本错误)。

<tspan
       x="938.91315"
       y="783.20563"
       id="tspan13017"
       style="font-weight:bold">Text1:</tspan><tspan
       x="938.91315"
       y="833.20563"
       id="tspan13019">Text2</tspan><tspan
       x="938.91315"
       y="883.20563"
       id="tspan13021">✗Text3</tspan>

等等

所以我想做的是将其更改为以下结果:

<tspan
       x="938.91315"
       y="200"
       id="tspan13017"
       style="font-weight:bold">Text1:</tspan><tspan
       x="938.91315"
       y="240"
       id="tspan13019">Text2</tspan><tspan
       x="938.91315"
       y="280"
       id="tspan13021">✗Text3</tspan>

等等

所以我回避并从 zzapper 找到了最好的 vim 提示资源,但我无法理解它:

convert yy to 10,11,12 :

:let i=10 | ’a,’bg/Abc/s/yy/\=i/ |let i=i+1

然后我将它改编成我能理解并且应该在我家工作的东西vim:

:let i=300 | 327,$ smagic ! y=\"[0-9]\+.[0-9]\+\" ! \=i ! g | let i=i+50

但不知何故它没有循环,我得到的是:

<tspan
       x="938.91315"
       300
       id="tspan13017"
       style="font-weight:bold">Text1:</tspan><tspan
       x="938.91315"
       300
       id="tspan13019">Text2</tspan><tspan
       x="938.91315"
       300
       id="tspan13021">✗Text3</tspan>

所以我被严重卡住了。我不知道什么不起作用:

我会尝试自己寻找其他资源,但我发现这种技巧很少见,而且就像 zzapper 提示一样,并不总是随手册一起提供。

一种修复方法:

:let i = 300 | g/\m\<y=/ s/\my="\zs\d\+.\d\+\ze"/\=i/ | let i += 50

翻译:

  • let i = 300 - 希望显而易见
  • g/\m\<y=/ ... - 对于匹配 \m\<y= 的所有行,应用以下命令; "following command" 是 s/.../.../ | let ...;正则表达式:
    • \m - "magic" 正则表达式
    • \< - 仅匹配单词边界
  • s/\my="\zs\d\+.\d\+\ze"/\=i/ - 替换;正则表达式:
    • \m - "magic" 正则表达式
    • \d\+ - 一位或多位数字
    • \zs...\ze - 仅替换这些点之间匹配的内容
    • \=i - 替换为表达式 i
    • 的值
  • let i += 50 - 希望再次显而易见。

更多信息::help :g:help \zs:help \zehelp s/\=

只是为了添加我的想法作为备忘录(因为编辑似乎不正确而将其写为答案)。抱歉,这不是最好的 vim 脚本,但它使我能够理解(我不是 vim 专家)。

:let i=300 | 323,$g/y="/smagic![0-9]\+.[0-9]\+!\=i!g | let i+=50

给i赋初值:

:let i=300

从第 323 行到文件末尾启动 :global (:g) 函数:

323,$g

用于执行命令的匹配模式(此处为文字)

y="

用魔法替换(魔法意味着特殊字符 "enabled")

smagic

要查找的模式

[0-9]\+.[0-9]\+

(0-9 之间的数字一次或多次,一个乱码,再次是数字)

替换为

\=i

\=告诉vim评价我不要乱写

为下一次迭代将 i 增加 50

let i+=50

这部分还在g函数中

分隔符,粗体: | 是不同函数之间的分隔符 / 是 :g 函数中的分隔符 !是smagic函数中的分隔符