[英]Vim search replace regex + incremental function
我目前卡在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提示中一样,并不总是带有手册。
解决它的一种方法:
:let i = 300 | g/\m\<y=/ s/\my="\zs\d\+.\d\+\ze"/\=i/ | let i += 50
翻译:
let i = 300
- 希望很明显 g/\\m\\<y=/ ...
- 对于匹配\\m\\<y=
所有行,应用以下命令; “跟随命令”是s/.../.../ | let ...
s/.../.../ | let ...
; 正则表达式:
\\m
- “魔术”正则表达式 \\<
- 仅匹配单词边界 s/\\my="\\zs\\d\\+.\\d\\+\\ze"/\\=i/
- 替代; 正则表达式:
\\m
- “魔术”正则表达式 \\d\\+
- 一个或多个数字 \\zs...\\ze
- 仅替换这些点之间匹配的内容 \\=i
- 用表达式i
的值替换 let i += 50
- 希望再次明显。 有关更多信息:: :help :g
, :help \\zs
, :help \\ze
, help s/\\\\=
。
只是添加我的作为备忘录(作为编辑写这个答案似乎不正确)。 对不起,这不是最好的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="
用魔法代替(魔术意味着特殊字符“启用”)
smagic
模式找到
[0-9]\+.[0-9]\+
(数字在0-9之间一次或多次,一个小点,数字再次)
替换为
\=i
\\ =告诉vim评估我不要写它
在下一次迭代中增加i为50
let i+=50
这部分仍然在g函数中。
分隔符,粗体: | 是不同函数之间的分隔符/是:g函数中的分隔符! 是smagic函数中的分隔符
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.