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

问题描述 投票:0回答:4

我有很多这样的台词:

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

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

vim replace vi
4个回答
7
投票

你可以使用

:normal
cmd,有时它比
:s
更容易。举个例子:

:norm! $F'di'3;.

将把你的线路改为:

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

如果您想在所有线路上执行此操作,只需

:%norm! ....
。您也可以将
norm
cmd 与
:g
结合使用,例如你想用
name:

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

3
投票

编写一个宏来实现这一点。要开始录制宏,请点击

q
,然后点击要保存宏的寄存器(例如在
a
寄存器下)。在命令模式下执行。

$F'di';;di'j

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

再次点击 q 即可完成宏。然后,要在单行上应用宏,请点击

@a
。要在所有行上应用宏,请输入
:%norm! @a


2
投票

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

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

生日字段也一样

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

“\{-}”与“*”相同,但使用最短匹配优先算法。 (参见:帮助非贪婪)

如果您真的喜欢用单个命令执行此操作:

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

“city:”和“birthday:”作为子表达式与\(和\)匹配,则可以在替换字符串中使用(表示第一个子表达式),需要结尾g选项在一行中进行多个替换。


0
投票

您还可以使用以下正则表达式:

:%s/'[^']\+'\([^']\+\)'[^']\+'}/''\1''}
© www.soinside.com 2019 - 2024. All rights reserved.