2016-04-02 92 views
0

我有一些条目一点JSON文件,这里是一个部分:Vim的 - 替代命令和正则表达式

"i":{ 
    "normale":"3c", 
    "bold":"4b", 
    "doppio":"6c"}, 
"is":{ 
    "normale":"2c", 
    "bold":"33", 
    "doppio":"66"}, 

我意识到我必须在所有的值前加上“\ U25”,所以我尝试下面的命令:

:%s:\("\)\(\d\d"\)\|\("\)\(\d\w"\):"\\u25\2

的想法是寻找任何“DD”或“DW”,并与"\u25同时保持rest.This替代第一双引号是结果:

"i":{ 
     "normale":"\u25, 
     "bold":"\u25, 
     "doppio":"\u25}, 
    "is":{ 
     "normale":"\u25, 
     "bold":"\u2533", 
     "doppio":"\u2566"}, 

如果匹配的字符串只有两位数,则该命令正常工作:第一个双引号(第一个组)被替换,第二个组保留原样。 但是,如果匹配的字符串有一个数字和一个字符,它似乎忽略了第二组,取代了整个字符串。这两种模式是相同的,除了\w,所以它应该完全一样。发生了什么?

回答

1

Vim将\d与数字匹配;你需要\x来匹配十六进制数字。

但它似乎要替换:"所有出现:"\u25

你可以使用:

:%s/:"/:"\\u25"/

或者,如果你想在前面加上\u25为2进制数字所有出现,

:%s/\x\x/\\u25&/

+0

啊哈!干净整洁,我没有意识到这一点。所以,也许我的命令不起作用,因为“dw”它被识别为一个十六进制字符,而不是“具有以下字符的数字” –

+1

由于\ d匹配十进制数字,并且\ x'匹配十六进制数字? –