Substituir incrementalmente uma determinada sequência

12

Digamos que tenho um texto como este abaixo:

CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)
CA (nn)

Agora eu quero substituir os nnnúmeros por assim

CA (0)
CA (1)
CA (2)
CA (3)
CA (4)
CA (5)
CA (6)
CA (7)
CA (8)
CA (9)
CA (10)

Eu costumava M-x replace-regexp nn RET \# RETfazer isso.

Questões:

  1. Desejo iniciar o número de substituição para começar em 1vez de 0. Ou melhor, comece com um número especificado, digamos 25. Como devo modificar o comando acima?
  2. Como substituir nnpor dígitos como 001, 002.... 998, 999etc - quero dizer com zeros à esquerda
Prasanna
fonte
Não é isso que você está pedindo, mas outra maneira de fazer isso é usar uma macro junto com um registro.
Caterpillar

Respostas:

12

Técnica geral

Sua string de substituição pode conter código arbitrário de Lisp. Na documentação para replace-regexp :

Em chamadas interativas, o texto de substituição pode conter '\,' seguido de uma expressão Lisp usada como parte do texto de substituição. Dentro dessa expressão, '\ &' é uma string que indica a correspondência inteira, '\ N' uma correspondência parcial, '# &' e '#N' os respectivos valores numéricos de 'string-to-number' e '# 'próprio para' número de substituições ', o número de substituições ocorridas até agora, começando do zero.

Podemos usar essa técnica de várias maneiras.

Começando de 1

O que queremos fazer é substituir nnpor um a mais do que replace-countvocê costumava usar \#.

Ligue #'replace-regexpcom o argumento \,(1+ \#):

C-M-% nn \,(1+ \#)irá substituir nn com 1primeiro, então 2, 3etc.

Começando às 25

Você pode modificar isso não apenas adicionando um, mas (no seu exemplo) 25:

C-M-% nn \,(+ 25 \#)

Zeros à esquerda

Ou podemos usar formatpara adicionar zeros à esquerda. Isso irá substituir nncom 000, 001, 002, etc. Você pode combinar outro código lisp para iniciar a 001, 025ou o que quiser.

C-M-% nn \,(format "$03d" \#)

zck
fonte
5

Você também pode usar cua-mode.

Selecione a região do retângulo (todo o nn) e depois M-x cua-rectangle-mark-mode.

Em seguida, M-ne aceite os valores padrão.

djangoliv
fonte
Eu gostaria de poder aceitar isso como uma resposta também
Prasanna