如何在vim编辑器中忽略搜索和替换中的少数字符

时间:2016-09-23 10:30:00

标签: vim replace

我想在vim编辑器中做这样的事情:

  

:%s​​ / SETR P:LL ../ SETR P:LH ../ g

我的文件中有多行以SETR P:开头,我想用L替换第二个H,而该行中剩余的两个字母将与它就在以前。

说它是否早于SETR P:LLHC
更换后,它将是SETR P:LHHC

我可以使用vim编辑器在一条指令中完成吗?

2 个答案:

答案 0 :(得分:2)

通常使用捕获组来完成。通过\(...\)捕获要在替换中重新包含的源模式部分。然后,在替换中,您可以通过\1引用该部分(并通过\2跟随,等等):

:%s/SETR P:LL\(..\)/SETR P:LH\1/g

这在:help /\(下记录。

此处的替代方法是使用LL(匹配结束)在\ze之后结束匹配。模式的其余部分(..)仍然被检查,但它不是匹配的一部分。

:%s/SETR P:LL\ze../SETR P:LH/g

顺便说一下,你的模式也会愉快地匹配更长的目标,例如: SETR P:LLHHHHHHHH。如果您需要将扩展​​名限制为两个字母,请使用..\>(关键字边界)或..\A\@=(非字母前瞻)。

答案 1 :(得分:1)

看起来你可以满足于:

:%s/SETR P:LL/SETR P:LH/

要从匹配项中排除前面的文字,您可以使用\@<=后备断言或\zs

:%s/\(SETR P:L\)\@<=L/H/
:%s/SETR P:L\zsL/H/

同样,可以使用匹配\@=\ze中的后续文字。