regex - Are there any cases when submatch(0) would not work in vim regexp replace? -
i have following source data, on attempting perform global replace via vim's regexp search , replace:
"text": [{ "uid": "...", "left": 50, "top": 715, "minsize": 60, "maxsize": 70, "width": "345px", "align": "center", "font": "...", "forbidden": "", "border": true, "printtype": 0 }
my search/replace string looks like:
:%s/"left": \(\d\+\)/"left": \=submatch(1)*0.66/g
effectively, attempting reduce "left"
property 66% of current value, in cases.
unfortunately, resulting string becomes:
"text": [{ "uid": "...", "left": =submatch(1)*0.66, "top": 715, "minsize": 60, "maxsize": 70, "width": "345px", "align": "center", "font": "...", "forbidden": "", "border": true, "printtype"
so, instead of getting "left": 33
"left": =submatch(1)*0.66
.
at first, thought because using =submatch(0)
. however, switching =submatch(0)
didn't fix problem, , returned =submatch(0)
in replaced string.
would there cases in expression wouldn't evaluated correctly?
when using expression in replacement replacement must start \=
, rest evaluated expression. in case escaped equals sign.
the easiest way use \zs
start match right before number
:%s/"left": \zs\d\+/\=submatch(0) * 0.66
and use submatch(0)
whole match, in case number.
Comments
Post a Comment