例如考虑以下行
'{"place":"buddy's home"}'
我只想替换buddy's
中的单引号。行首和行尾的单引号必须完整无缺。所以结果行看起来像。
'{"place":"buddy\'s home"}'
可能有多行,每行中多次出现此类单引号。除了行首和行尾,我必须全部逃脱。
我可以使用vim regex :/.'.
来找出这种模式。这种模式可以确保单引号被两个字符包围,并且不在行首或行尾。但是我在所有地方都无法将y's
替换为y\'s
时遇到麻烦。
答案 0 :(得分:3)
如果正则表达式.'.
足够准确,则可以将所有出现的内容替换为:
:%s/.\zs'\ze./\\'/g
除了使用\ze
和\zs
,您还可以使用组(...)
。但是我发现此版本更具可读性。
有关更多信息,请参见:h /\zs
和:h /\ze
。
答案 1 :(得分:1)
:%s/\(.\)'\(.\)/\1\\'\2/gc
:%s/
代替整个缓冲区(请参阅:help range
来解释%
)\(.\)
匹配一个字符并将其保存在捕获组1中(请参阅:help \(
)'
文字'
\(.\)
匹配一个字符并将其保存在捕获组2中/
替换为\1
捕获组1(请参阅:help \1
)\\'
,这是一个\'
(您需要转义反斜杠)\2
捕获组2 /gc
全局替换(整行)并要求确认(请参阅:help :s_flags
)如果确定所有替换都是合法的,则可以省略c
选项。
正如kongo2002在他的回答中所说,您可以将捕获组替换为\zs
和\ze
:
\zs
将开始一场比赛,并在此之前放弃所有比赛\ze
将结束比赛并在比赛结束后丢弃所有内容请参见:help \ze
和:help \zs
。