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

时间:2015-10-24 11:15:20

标签: regex function vim increment inkscape

我目前卡在vim中试图找到一个搜索/替换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技巧资源,但我无法理解:

  

将yy转换为10,11,12:

     

:让我= 10 | 'a,'bg / Abc / s / yy / \ = i / |让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>

所以我在这里严重陷入困境。我无法弄清楚什么不起作用:

  • 我对原始公式的改编?
  • 我的数据布局?
  • 我的.vimrc?

我会尝试自己寻找其他资源,但是就这种技巧而言,我发现它们非常罕见,就像在zzapper提示中一样,并不总是带有手册。

2 个答案:

答案 0 :(得分:2)

解决问题的一种方法:

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

翻译:

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

有关详细信息::help :g:help \zs:help \zehelp s/\\=

答案 1 :(得分:1)

只是将我的观点添加为备忘录(将此作为答案写成EDIT似乎并不正确)。对不起,这不是最好的vim脚本,但它使我能够理解(我不是一个vim专家)。

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

将初始值分配给i:

:let i=300

开始:从第323行到文件末尾的全局(:g)函数:

323,$g

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

y="

用魔法代替(魔术意味着特殊字符&#34;启用&#34;)

smagic

寻找模式

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

(0-9之间的数字一次或多次,一个小点,数字再次出现)

替换为

\=i

\ =告诉vim评估我不要写它

在下一次迭代中增加i为50

let i+=50

这部分仍然在g函数中。

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