2016-04-02 10 views
0

Ich habe eine kleine JSON-Dateien mit einigen Einträgen, hier ist ein Schnitt:Vim - Substitute Befehl und regexp

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

mir klar, ich muss hinzufügen, „\ u25“ vor allen Werten, so dass ich diesen Befehl versucht:

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

die Idee ist, für entweder „dd“ oder „dw“, und ersetzen Sie den ersten doppelten Anführungszeichen mit "\u25 zu suchen, während die rest.This zu halten, ist das Ergebnis:

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

Wenn die übereinstimmende Zeichenkette nur die zwei Ziffern hat, funktioniert der Befehl gut: das erste doppelte Zitat (die erste Gruppe) wird ersetzt und die zweite Gruppe bleibt so wie sie war. Wenn die übereinstimmende Zeichenfolge jedoch eine Ziffer und ein Zeichen enthält, scheint sie die zweite Gruppe zu ignorieren, indem sie die gesamte Zeichenfolge ersetzt. Die beiden Muster sind bis auf \w identisch, also sollte es genauso funktionieren. Was ist los?

Antwort

1

Vim entspricht \d den Ziffern; Sie benötigen \x, um Hexadezimalziffern zu entsprechen.

Aber es scheint, dass Sie alle Vorkommen von :" durch :"\u25 ersetzen möchten.

Können Sie verwenden:

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

Oder, wenn Sie \u25 auf alle Vorkommen von 2 Hex-Ziffern voranstellen wollen,

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

+0

Aha! Schön und sauber, das habe ich nicht bemerkt. Also, vielleicht funktioniert mein Befehl nicht, weil "dw" als hexadezimales Zeichen statt "einer Ziffer mit einem folgenden Zeichen" erkannt wird. –

+1

Weil '\ d' Dezimalziffern entspricht und' \ x' Hexadezimalziffern entspricht? –