gpt4 book ai didi

vim:用相同数量的新字符串替换子匹配

转载 作者:行者123 更新时间:2023-12-04 22:35:43 25 4
gpt4 key购买 nike

我的计划是做一个非常标准的搜索替换,将 old_string 的所有实例替换为 new_string。问题是我只想对特定 prefix 之后的任意数量的 old_strings 执行此操作。例如:

old_string = "a"
new_string = "b"
prefix = "xxxx"

xxxxaaaaaaaa => xxxxbbbbbbbb
xxxxaaapostfix => xxxxbbbpostfix
xxaaaa => xxaaaa

等我不知道该怎么做。我想有一些方法可以说 s/xxxxa*/xxxxb{number of a's}/g 之类的,但我不知道它是什么。

最佳答案

你绝对可以做到!我会使用 \= 寄存器来评估一些 vimscript。来自 :h s/\=:

Substitute with an expression           *sub-replace-expression*
*sub-replace-\=* *s/\=*
When the substitute string starts with "\=" the remainder is interpreted as an
expression.

The special meaning for characters as mentioned at |sub-replace-special| does
not apply except for "<CR>". A <NL> character is used as a line break, you
can get one with a double-quote string: "\n". Prepend a backslash to get a
real <NL> character (which will be a NUL in the file).

然后您可以使用repeatsubmatch 函数来构建正确的字符串。例如:

:%s/\(xxxx\)\(a\+\)/\=submatch(1).repeat('b', len(submatch(2)))

我选择使用 \+ 而不是 * 因为这样在替换命令完成后将找不到模式(这会影响 hlsearchn)

当然,如果你使用 \zs\ze(匹配开始/结束)原子,你可以使用更少的捕获组,这使得这个 waaay 更短更清晰。

:%s/xxxx\zsa\+/\=repeat('b', len(submatch(0)))

关于vim:用相同数量的新字符串替换子匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45309595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com