我的文字中有这样的台词。
模式之前的文本 = 垃圾** 模式之后的文本是模式
如果在 VIM 中我这样做,%s/pattern/saturn/
它将替换所有出现的pattern
.但我只想替换之后发生的那些事件=
。它应该忽略该行之前出现的所有内容=
。怎么做?
答案1
pattern
假设before只出现一次=
,您可以分两步执行此操作:
:%s/pattern/saturn/g
:%s/saturn\(.\{-}=\)/pattern\1/
指示惰性匹配(也称为非贪婪匹配)\{-}
。.
解释
第一步将所有出现的 替换pattern
为saturn
下一步,然后查找saturn
之前的单词=
并将其替换为pattern
。
警告
=
这假设每行只出现一次。
更好的方法(仅假设=
每行一个)
您可以使用递归宏来完成此操作:
qaqqa:%s/\(=.\{-}\)pattern/\1saturn/@aq@a
这会将单个出现的pattern
after替换=
为saturn
。当存储为宏并递归调用时,它将继续处理文件,直到没有任何东西可以替代。这是很黑客的,但它确实有效。
也可以看看
答案2
您可以使用特殊原子\@<=
来断言匹配前(=.*
使其任何地方在那一行之前):
:%s/\(=.*\)\@<=pattern/saturn/g