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: Des idées à ce sujet? P> ceci est un test. Code> et nous voulons remplacer toutes les occurrences de
est code> avec
x code> et leur index d'avoir quelque chose comme:
thx-0 x-1 un test. code> p>
3 Réponses :
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>
Et si vous voulez que ce soit insensible à l'affaire?
Il suffit d'ajouter le modificateur / i code>, c'est-à-dire
/ gei code>.
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; code>.
Solution simple dans ou selon ANUBHAVA SIR, ajout de la version plus courte du code ci-dessus: P> awk code> sera:
awk '{while(sub(/[iI][Ss]/,"X-"count++));count=""} 1' Input_file
Cela peut être plus court: awk '{alors que (SUB (/ [II] [SS] /, "X-" Nombre ++));} 1' code>
@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.
Voici une alternative GNU-AWK une doublure: p> pour réinitialiser le compteur pour chaque ligne: p> p>