VIM 替换一行中特定单词后出现的模式

VIM 替换一行中特定单词后出现的模式

我的文字中有这样的台词。

模式之前的文本 = 垃圾** 模式之后的文本是模式

如果在 VIM 中我这样做,%s/pattern/saturn/它将替换所有出现的pattern.但我只想替换之后发生的那些事件=。它应该忽略该行之前出现的所有内容=。怎么做?

答案1

pattern假设before只出现一次=,您可以分两步执行此操作:

:%s/pattern/saturn/g
:%s/saturn\(.\{-}=\)/pattern\1/

指示惰性匹配(也称为非贪婪匹配)\{-}.

解释

第一步将所有出现的 替换patternsaturn下一步,然后查找saturn之前的单词=并将其替换为pattern

警告

=这假设每行只出现一次。

更好的方法(仅假设=每行一个)

您可以使用递归宏来完成此操作:

qaqqa:%s/\(=.\{-}\)pattern/\1saturn/@aq@a

这会将单个出现的patternafter替换=saturn。当存储为宏并递归调用时,它将继续处理文件,直到没有任何东西可以替代。这是很黑客的,但它确实有效。

也可以看看

答案2

您可以使用特殊原子\@<=来断言匹配(=.*使其任何地方在那一行之前):

:%s/\(=.*\)\@<=pattern/saturn/g

相关内容