我目前卡在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>
所以我在这里严重陷入困境。我无法弄清楚什么不起作用:
我会尝试自己寻找其他资源,但是就这种技巧而言,我发现它们非常罕见,就像在zzapper提示中一样,并不总是带有手册。
答案 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 \ze
,help 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函数中的分隔符