我有很多这样的台词:
{ id: 22, name: 'Alice', score: 123, city: 'Atlanta', birthday: '1981/12/03'},
我想使用VI(准确地说是gvim)搜索并替换并清空最后两组单引号。
你可以使用
:normal
cmd,有时它比:s
更容易。举个例子:
:norm! $F'di'3;.
将把你的线路改为:
{ id: 22, name: 'Alice', score: 123, city: '', birthday: ''},
如果您想在所有线路上执行此操作,只需
:%norm! ....
。您也可以将 norm
cmd 与 :g
结合使用,例如你想用 name:
对所有行进行此转换
:g/name:/norm! ...
编写一个宏来实现这一点。要开始录制宏,请点击
q
,然后点击要保存宏的寄存器(例如在 a
寄存器下)。在命令模式下执行。
$F'di';;di'j
$ - 转到行尾
F' - 向后搜索 '
di' - 删除单引号之间的内容
;; - 转到前面的单引号
di' - 再次删除
j - 转到下面的行
再次点击 q 即可完成宏。然后,要在单行上应用宏,请点击
@a
。要在所有行上应用宏,请输入 :%norm! @a
如果你想使用搜索和替换,你可以这样做:
:%s/city: '.\{-}'/city: ''
生日字段也一样
:%s/birthday: '.\{-}'/birthday: ''
“\{-}”与“*”相同,但使用最短匹配优先算法。 (参见:帮助非贪婪)
如果您真的喜欢用单个命令执行此操作:
%s/\(city:\|birthday:\) '.\{-}'/\1 ''/g
“city:”和“birthday:”作为子表达式与\(和\)匹配,则可以在替换字符串中使用(表示第一个子表达式),需要结尾g选项在一行中进行多个替换。
您还可以使用以下正则表达式:
:%s/'[^']\+'\([^']\+\)'[^']\+'}/''\1''}