O Vim avalia sua expressão da esquerda para a direita, então ela primeiro concatena "Z" e a correspondência e, a seguir, subtrai 87 da string (que produz 0). Isso pode ser corrigido com parênteses:
:%s/Z\(\d\d\)/\="Z".(submatch(1)-87)/
Para ser mais explícito (e lidar com números decimais que começam com 0
), você pode lançar str2nr()
, assim:
:%s/Z\(\d\d\)/\="Z".(str2nr(submatch(1))-87)/