vi: есть ли способ манипулировать совпадениями с регулярными выражениями? - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть файл со следующей строкой:

img width="240" height="120"

Я хочу масштабировать ширину и высоту на одинаковую величину, поэтому

:%s/width="\\(.*\\)" height="\\(.*\\)"/width="2*\\1" height="2*\\2"/g

производит

img width="2*240" height="2*120"

в любом случае можно заставить vi вычислить 2*240=480 и поставить 480 в результате.

спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 18 февраля 2010

Я могу получить что-то близкое к тому, что вы спрашиваете

:s/\(\d\+\)/\=submatch(1)*2/gc

Но я бы использовал внешний фильтр.

1 голос
/ 18 февраля 2010

Я бы обычно использовал внешний фильтр для такого рода вещей:

:%!perl -pe 's/width="(\d*)"/sprintf "width=\"\%d\"", 2 * $1/e'

Обратите внимание, что есть дополнительный escape, который не будет отображаться при непосредственном запуске perl. Вы должны экранировать знак%, иначе vim расширит его до текущего имени файла.

Но вы можете попробовать:

:help sub-replace-expression

, если вы не хотите использовать внешний фильтр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...