这里有一个名为employees.txt的示例文本文件。它包含员工的姓名、街道和城市。
我的问题是:如何将所有“维多利亚”城市实例替换为“维多利亚市”。只有城市受到影响,而不会影响维多利亚大道等地点或 Ashley Victoria 等人物?
我希望有一个人可以帮助我。
答案1
你可以告诉 vim 要求确认:
:%s/Victoria/City\sof\sVictoria/gc
- %s 替换,g 全局执行,c 请求确认
- \s 表示空格。
这可能是最快的,但确实需要一些手动工作。
如果只有这两个,那么这个也可以:
:%s/Victoria/City\sof\sVictoria/g
:%s/City\sof\sVictoria\sDrive/City\sof\sVictoria/g
:%s/Ashley\sCity\sof\sVictoria/Ashley\sVictoria/g
但如果还有更多,这个列表就会很长。在执行此操作之前,请务必进行备份 ;)
答案2
你似乎在问正则表达式环视断言
至少在vim
(五我我是已证明),您可以将其用于\@!
负向前瞻和\@<!
负向后瞻。例如,要Victoria
匹配不是前面是Ashley
(Ashley-space):
\(Ashley \)\@<!Victoria
而与之匹配Victoria
的是不是接着是Drive
(space-Drive):
Victoria\( Drive\)\@!
把它们放在一起:
:s/\(Ashley \)\@<!Victoria\( Drive\)\@!/City of &/g
其中&
RHS 反向替换匹配的Victoria
。推广到 之前和之后的任何大写“单词” Victoria
:
:s/\([[:upper:]][[:alpha:]-]* \)\@<!Victoria\( [[:upper:]][[:alpha:]-]*\)\@!/City of &/g
也可以看看:
答案3
另一种方法:(手动)
搜索Victoria
:
/维多利亚
如果符合您的要求,请进入插入模式(i
)然后输入City of
然后在命令模式下转到下一个查找(n
),如果匹配,则点击点(.
)它将City of
再次插入,如果不匹配,则转到下一个查找等等......