假设我有以下文件
<block>
<foo val="bar"/>
<foo val="bar"/>
</block>
<block>
<foo val="bar"/>
<foo val="bar"/>
</block>
我怎么能把它变成
<block>
<foo val="bar1"/>
<foo val="bar"/>
</block>
<block>
<foo val="bar1"/>
<foo val="bar"/>
</block>
我试着用:%s/bar/bar1/gc
录制一个宏,然后按y
和n
各一次,然后试着编辑这个宏。由于某种原因,我不能编辑这个宏。
7条答案
按热度按时间hfyxw5xn1#
为了说明这可以在替换中完成:
概述
在每次替换时原地反转数组后,用变量
a
中数组的第一个元素替换每个bar
的末尾。细节的荣耀
let a = ['', '1']
定义一个变量a
来保存数组%s/.../.../
对文件中的每一行进行替换%s/bar\zs/.../
在条形图上进行替换,但在条形图之后使用\zs
开始替换:s
命令的替换部分内的\=
使用以下表达式的值reverse(a)
reverse只会反转数组,但会就地执行此操作reverse(a)[0]
reverse返回现在已反转的数组,因此获取第一个元素/g
替换行中的所有匹配项(可选)一般情况
一般情况下,会就地“旋转”数组
a
,并使用数组的最后一个位置做为替代的取代值。有关更多帮助,请参阅
w46czmvw2#
您可以使用
它会在每一场比赛中问你,如果你想取代它。
否则,您必须在中指定整个内容,并仅将第一个栏替换为bar1。
n3h0vuf23#
我会用一个宏来实现:
然后,执行
{count}@v
。acruukt94#
试试这个:
ars1skjm5#
nbewdwxp6#
下面是一个自定义命令,它使用一个 replace expression 来计算已完成的替换次数,并使用一个传递的附加参数来决定是否应该进行替换。(这允许更复杂的排列,而不是每隔一个。)这样,您的示例就简单了:
下面是这个实现(不幸的是它很长):
编辑
我现在已经将它(连同相关命令)发布为PatternsOnText plugin。
kr98yfug7#
我找到了一个更简单的解决方案:
另一个绝佳选择
"我那复杂的老办法"