Remplacer de manière incrémentielle une chaîne donnée

12

Disons que j'ai un texte comme celui-ci ci-dessous:

AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)
AC (nn)

Maintenant, je veux remplacer le nnpar des chiffres comme ça

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

J'avais l'habitude M-x replace-regexp nn RET \# RETd'accomplir cela.

Des questions:

  1. Je veux commencer le numéro de remplacement à partir de 1plutôt qu'à partir de 0. Ou plutôt commencer à partir d'un nombre spécifié, par exemple 25. Comment dois-je modifier la commande ci-dessus?
  2. Comment remplacer nnpar des chiffres comme 001, 002.... 998, 999etc - je veux dire avec des zéros non significatifs
Prasanna
la source
Ce n'est pas ce que vous demandez, mais une autre façon de procéder consiste à utiliser une macro avec un registre.
Caterpillar

Réponses:

12

Technique générale

Votre chaîne de remplacement peut contenir du code lisp arbitraire. Dans la documentation de replace-regexp :

Dans les appels interactifs, le texte de remplacement peut contenir «\», suivi d'une expression Lisp utilisée dans le cadre du texte de remplacement. À l'intérieur de cette expression, '\ &' est une chaîne indiquant la correspondance entière, '\ N' une correspondance partielle, '# &' et '#N' les valeurs numériques respectives de 'string-to-number' et '# 'lui-même pour' replace-count ', le nombre de remplacements s'est produit jusqu'à présent, à partir de zéro.

Nous pouvons utiliser cette technique de plusieurs façons.

Commençant par 1

Ce que nous voulons faire, c'est le remplacer nnpar un de plus que celui que replace-countvous avez utilisé \#.

Appelez #'replace-regexpavec l'argument \,(1+ \#):

C-M-% nn \,(1+ \#)remplacera nn avec d' 1abord, puis 2, 3etc.

À partir de 25

Vous pouvez le modifier non seulement en en ajoutant un, mais (dans votre exemple) 25:

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

Zéros de tête

Ou nous pouvons utiliser formatpour ajouter des zéros non significatifs. Cela remplacera nnavec 000, 001, 002, etc. Vous pouvez combiner autre code Lisp ci - dessus pour commencer à 001, 025ou tout ce que vous voulez.

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

zck
la source
5

Vous pouvez également utiliser cua-mode.

Sélectionnez la région du rectangle (tous les nn) puis M-x cua-rectangle-mark-mode.

Ensuite, M-net acceptez les valeurs par défaut.

djangoliv
la source
J'aimerais pouvoir accepter cela aussi comme réponse
Prasanna