vi:有没有办法操纵正则表达式匹配?

时间:2010-02-17 21:01:19

标签: vim

我有一个包含以下行的文件:

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 个答案:

答案 0 :(得分:4)

我可以接近你提出的问题

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

但我会使用外部过滤器。

答案 1 :(得分:1)

我通常会使用外部过滤器来处理这类事情:

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

请注意,在直接运行perl时不会出现额外的转义。您必须转义%符号或vim将其扩展为当前文件名。

但你可以试试:

:help sub-replace-expression

如果您不想使用外部过滤器。