0
votes

remplacer plusieurs correspondances d'une sous-chaîne avec leurs index

En supposant que vous avez une chaîne avec plusieurs occurrences de la même sous-chaîne, quel serait le meilleur one-liner pour remplacer les correspondances avec leur autre sous-chaîne contenant également l'index des calculs? Par exemple, disons que vous avez la chaîne suivante: ceci est un test. et nous voulons remplacer toutes les occurrences de est avec x et leur index d'avoir quelque chose comme: thx-0 x-1 un test.

Des idées à ce sujet?


0 commentaires

3 Réponses :


1
votes

Perl à la rescousse!

echo 'This is a test.' | perl -pe 's/is/"X-" . $c++/ge' 
  • -p code> lit la ligne d'entrée par ligne, exécute le code dessus et génère la ligne traitée. li>
  • s /// g code> exécute une substitution globale, c'est-à-dire sur toutes les positions où il est possible li>
  • / e code> interprète la pièce de rechange sous forme de code et l'exécute. Le code ici utilise ici l'opérateur de concaténation . Code> sur la chaîne x - code> et la valeur du $ C code>, en augmentant par une en même temps. li> ul> p>


4 commentaires

Et si vous voulez que ce soit insensible à l'affaire?


Il suffit d'ajouter le modificateur / i , c'est-à-dire / gei .


Merci, ça marche. Ça fonctionne bien. Mais comment vous limitez-vous la portée du compteur aux lignes? Je veux dire que si vous voulez que l'index commence à 0 dans chaque ligne?


@amin: puis préfixez la substitution avec $ c = 0; .



1
votes

Solution simple dans awk code> sera: xxx pré>

ou selon ANUBHAVA SIR, ajout de la version plus courte du code ci-dessus: P>

awk '{while(sub(/[iI][Ss]/,"X-"count++));count=""} 1'  Input_file


4 commentaires

Cela peut être plus court: awk '{alors que (SUB (/ [II] [SS] /, "X-" Nombre ++));} 1'


@anubhava, bien sûr, merci monsieur ajouté cette version maintenant, acclamations.


Merci les gars. Ça marche. Mais comment vous limitez-vous la portée du compteur à la ligne? Je veux dire que si vous voulez que l'index commence à 0 dans chaque ligne?


@Amin, bien sûr, faites les modifications maintenant, celles-ci débuteront sur le nombre de x- à partir de 0 dans chaque ligne, Lemme sait en cas de requête ici.



0
votes

Voici une alternative GNU-AWK une doublure: xxx

xxx

pour réinitialiser le compteur pour chaque ligne: xxx

xxx


0 commentaires