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>
所以我被严重卡住了。我不知道什么不起作用:
- 我对原公式的改编?
- 我的数据布局?
- 我的.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=
的所有行,应用以下命令; "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 \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 行到文件末尾启动 :global (:g) 函数:
323,$g
用于执行命令的匹配模式(此处为文字)
y="
用魔法替换(魔法意味着特殊字符 "enabled")
smagic
要查找的模式
[0-9]\+.[0-9]\+
(0-9 之间的数字一次或多次,一个乱码,再次是数字)
替换为
\=i
\=告诉vim评价我不要乱写
为下一次迭代将 i 增加 50
let i+=50
这部分还在g函数中
分隔符,粗体:
| 是不同函数之间的分隔符
/ 是 :g 函数中的分隔符
!是smagic函数中的分隔符
我目前陷入 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>
所以我被严重卡住了。我不知道什么不起作用:
- 我对原公式的改编?
- 我的数据布局?
- 我的.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=
的所有行,应用以下命令; "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 \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 行到文件末尾启动 :global (:g) 函数:
323,$g
用于执行命令的匹配模式(此处为文字)
y="
用魔法替换(魔法意味着特殊字符 "enabled")
smagic
要查找的模式
[0-9]\+.[0-9]\+
(0-9 之间的数字一次或多次,一个乱码,再次是数字)
替换为
\=i
\=告诉vim评价我不要乱写
为下一次迭代将 i 增加 50
let i+=50
这部分还在g函数中
分隔符,粗体: | 是不同函数之间的分隔符 / 是 :g 函数中的分隔符 !是smagic函数中的分隔符