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
:rendsed
interpréter le modèle comme un modèle ERE (Extended Regular Expression) ;> out
:redirigestdout
pourout
;
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 à un
personnage
)
:arrête de regrouper les chaînes autorisées2
:correspond à un2
personnage:
: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 un
personnage
/
: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 à un2
personnage:
: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:0
chaî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