使用VI搜索并替换如何替换最后两组单引号中的文本?

时间:2014-10-14 15:54:36

标签: vim replace vi

我有很多这样的台词:

{ id: 22, name: 'Alice', score: 123, city: 'Atlanta', birthday: '1981/12/03'},

我想使用VI(确切地说是gvim)搜索并替换并清空最后两组单引号。

3 个答案:

答案 0 :(得分:7)

您可以使用:normal cmd,有时它比:s更容易。为你的例子:

:norm! $F'di'3;.

会将您的行改为:

{ id: 22, name: 'Alice', score: 123, city: '', birthday: ''},

如果您想在所有行上执行此操作,只需:%norm! ....。您也可以将norm cmd与:g合并,例如您希望使用name:

对所有行进行此转换
:g/name:/norm! ...

答案 1 :(得分:3)

编写宏来实现这一目标。要开始录制宏,请点击q,然后点击要保存的寄存器(例如在a寄存器下)。在命令模式下执行。

$F'di';;di'j

$ - 转到行尾 F' - 向后搜索'
di' - 删除单引号之间的内容 ;; - 转到之前的单引号
di' - 再次删除
j - 转到下面的行

再次点击q完成一个宏。然后,在单行上应用宏@a。要在所有行上应用宏,请键入:%norm! @a

答案 2 :(得分:2)

如果您想使用搜索和替换,您可以这样做:

:%s/city: '.\{-}'/city: ''

和生日字段相同

:%s/birthday: '.\{-}'/birthday: ''

" \ { - }"与" *"相同但使用de shortest match first算法。 (参见:帮助非贪婪)

如果您真的喜欢在一个命令中执行此操作:

%s/\(city:\|birthday:\) '.\{-}'/\1 ''/g

"城市:"和"生日:"作为子表达式与\(和\)匹配,然后你可以在替换字符串中使用\ 1(表示第一个子表达式),需要结束g选项在单个字符串中进行多个替换线。

相关问题