繁体   English   中英

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

[英]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>

所以在这里我被严重困住了。 我无法弄清楚什么是行不通的:

  • 我改编的原始配方?
  • 我的数据布局?
  • 我的.vimrc?

我会尝试自己寻找其他资源,但在这种技巧上,我发现它们非常罕见,就像在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 \\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行到文件末尾的全局(: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM