Qualquer editor de texto que possa aplicar alguma matemática ao texto de substituição?

14

Eu tenho um arquivo XML grande

<obj param="2542">
<obj param="2333">
<obj param="6433">

Preciso aumentar todos os valores "param" em alguns números. Eu posso combinar números que eu preciso com a pesquisa de regexp em muitos editores, mas como aplicar alguns cálculos ao substituto?

    
por serg 27.09.2010 / 18:54

3 respostas

18

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.

    
por 27.09.2010 / 22:35
7

No Emacs (desde a versão 23): use \, para executar código Lisp arbitrário em substituição de expressão regular . Por exemplo, para alinhar os números que você poderia usar

M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"

No Vim: inicie o seu texto de substituição com \= (consulte :help sub-replace-special ). Por exemplo, para quadrar os números:

s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!

Vários editores permitem que você faça esse tipo de coisa com macros: defina uma macro que 1. procure a próxima correspondência e 2. execute a substituição (usando uma ferramenta externa para aritmética, se necessário); repita a macro quantas vezes você tiver correspondências.

    
por 27.09.2010 / 22:42
1

Você pode usar o vim para fazer isso por você. Basta abrir o arquivo e registrar um macro . Exemplo: procure por qualquer número

/[0-9]{1,}

depois, pressione q e a (armazene a macro no registrador a). Depois disso, pressione Ctrl-X (aumentando o número em 1) e pressione n (para o próximo resultado da pesquisa) depois. Depois de ter feito isso, pressione q novamente para salvar a macro. Agora você pode aplicar a macro ao próximo número pressionando @ + a. Isso mudará o número atual e saltará para o próximo. Repetindo isso ou usando x @ a, você pode repetir x vezes.

Bem, essa descrição pode não ser suficiente para mostrar como isso pode ser feito. Basta se referir a um tutorial descrevendo o mecanismo de macro no vim.

    
por 27.09.2010 / 20:10
0

O editor do emacs poderia fazê-lo - ou você poderia fazê-lo com um programa python muito simples.

    
por 27.09.2010 / 20:52