Depois de analisar um pouco mais, vim pode fazer isso com um único comando, sem script. Por exemplo, para adicionar 50 a todos os números que seguem <obj param="
você poderia usar:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Deixe-me quebrar isso.
:
é o modo geral de entrar / significar o modo de linha de comando no vim.
%
significa dentro do escopo de todo o documento; você poderia colocar um intervalo numérico, por exemplo, 1,50
para fazer isso nas primeiras 50 linhas.
s
é uma abreviação de substituto (você pode escrever a palavra inteira se preferir)
@
é o delimitador; você poderia usar qualquer outro personagem desde que não esteja no que você está procurando. Apenas use três vezes. (A sintaxe é semelhante a sed
.)
Tudo até a próxima ocorrência do delimitador @ é o padrão reg ex para procurar, neste caso <obj param="
seguido por \d\+
, que é qualquer número de dígitos. O \(
e o \)
estão lá para definir essa sequência inteira de dígitos como um único grupo ex reg que corresponderia às referências anteriores como ou o comando
submatch
do vim.
Em seguida, o delimitador @
marca o que segue como o texto de substituição.
O \=
no início aqui significa substituir o resultado de alguma expressão avaliada, em vez de um padrão ou string reg ex, que é a chave aqui.
Em seguida, temos '<obj param="'
para o início do texto de substituição. O .
que segue é a função do vim para concatenar strings.
submatch(1)
é uma função interna do vim que pode ser usada somente dentro de um comando de substituição e retorna a string que é a mesma que a regex ; você usaria
submatch(2)
para o equivalente de da regex e assim por diante. (
é todo o padrão correspondente, mas não queremos isso aqui.) O \(
\)
e submatch(1)
no padrão de pesquisa são usados para marcar o que conta como (submatch(1) + 50)
.
Por isso, <obj param="
fornece o resultado da adição de 50 ao número cujos dígitos seguem @
no formulário do padrão de pesquisa.
O delimitador g
é novamente usado para marcar o final do texto de substituição.
O sinalizador %code% é usado para tornar as substituições globais; você poderia omitir isso se quisesse apenas substituir a primeira instância em cada linha.
Provavelmente você pode trabalhar a partir daí como adicionar números diferentes, ou subtrair ou dividir, etc.