Exemple :
1:20 2:25 3:0.432 2:-17 10:12
Je veux remplacer toutes les chaînes qui commencent avec 2: à 2:0 .
Sortie :
1:20 2:0 3:0.432 2:0 10:12
Réponse acceptée :
Utilisation de sed :
sed -E 's/((^| )2:)[^ ]*/\10/g' in > out
Aussi, comme inspiré par la réponse de souravc, s'il n'y a pas une chance d'avoir 2: sous-chaîne après le début d'une chaîne not contenant un 2: sous-chaîne (par exemple, il n'y a pas une chance d'un 1:202:25 chaîne, que la commande raccourcie suivante remplacerait par 1:202:0 ), la commande peut être raccourcie à ceci :
sed -E 's/2:[^ ]*/2:0/g' in > out
Répartition des commandes n°1/n°2 :
-E:rendsedinterpréter le modèle comme un modèle ERE (Extended Regular Expression) ;> out:redirigestdoutpourout;
sed répartition de la commande #1 :
s:affirme pour effectuer une substitution/:démarre le motif(:démarre le groupe de capture(:commence à regrouper les chaînes autorisées^:correspond au début de la ligne|:sépare la deuxième chaîne autorisée:correspond à unpersonnage):arrête de regrouper les chaînes autorisées2:correspond à un2personnage::correspond à un:personnage):arrête le groupe de capture[^ ]*:correspond à n'importe quel nombre de caractères non/:arrête le motif / démarre la chaîne de remplacement\1:référence arrière remplacée par le premier groupe de capture:ajoute unpersonnage/:arrête la chaîne de remplacement / démarre les drapeaux du motifg:affirme effectuer la substitution globalement, c'est-à-dire substituer chaque occurrence du motif dans la ligne
sed répartition de la commande #2 :
s:affirme pour effectuer une substitution/:démarre le motif2:correspond à un2personnage::correspond à un:personnage[^ ]*:correspond à n'importe quel nombre de caractères non/:arrête le motif / démarre la chaîne de remplacement2:0:ajoute un2:0chaîne/:arrête la chaîne de remplacement / démarre les drapeaux du motifg:affirme effectuer la substitution globalement, c'est-à-dire substituer chaque occurrence du motif dans la ligne