![VIM 替换一行中特定单词后出现的模式](https://linux22.com/image/50180/VIM%20%E6%9B%BF%E6%8D%A2%E4%B8%80%E8%A1%8C%E4%B8%AD%E7%89%B9%E5%AE%9A%E5%8D%95%E8%AF%8D%E5%90%8E%E5%87%BA%E7%8E%B0%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
我的文字中有这样的台词。
模式之前的文本 = 垃圾** 模式之后的文本是模式
如果在 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