使用vim转义特定模式的单引号

时间:2018-10-25 17:48:26

标签: regex vim

例如考虑以下行

'{"place":"buddy's home"}'

我只想替换buddy's中的单引号。行首和行尾的单引号必须完整无缺。所以结果行看起来像。

'{"place":"buddy\'s home"}'

可能有多行,每行中多次出现此类单引号。除了行首和行尾,我必须全部逃脱。

我可以使用vim regex :/.'.来找出这种模式。这种模式可以确保单引号被两个字符包围,并且不在行首或行尾。但是我在所有地方都无法将y's替换为y\'s时遇到麻烦。

2 个答案:

答案 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