Rechercher et remplacer par plus court
Cobalt2225
Messages postés
24
Statut
Membre
-
Cobalt2225 Messages postés 24 Statut Membre -
Cobalt2225 Messages postés 24 Statut Membre -
Bonjour,
Je suis assez nouveau sur unix.
Je suis en train de construire un script qui doit me permettre de traiter un fichier et de remplacer une certaine occurence de chaine par une autre, mais en plus court.
Je m'explique par l'exemple :
J'ai ce fichier en entrée : test1.xml, qui contient ceci :
Ce que je souhaite, c'est remplacer uniquement les chaines de type: <from>51724600000 (<from>ET_11_CHIFFRES) par <from>517246 (<from>ET_6_CHIFFRES)
Ainsi, la sortie suite a ma commande unix serait :
J'avais pensé a une commande de ce type :
mais cette commande ne fait rien en fait, car je n'arrive pas a enlever les 5 derniers chiffres ... et je vous l'assure, je galere severe ;-)
Pourtant, une petite voix me dit que ca doit pas etre si compliqué !
Merci d'avance aux ames charitables !
Je suis assez nouveau sur unix.
Je suis en train de construire un script qui doit me permettre de traiter un fichier et de remplacer une certaine occurence de chaine par une autre, mais en plus court.
Je m'explique par l'exemple :
J'ai ce fichier en entrée : test1.xml, qui contient ceci :
<bin_range>
<from>516146</from>
<to>516146</to>
<effective_from_date>2018-08-06</effective_from_date>
<status>ACTIVE</status>
</bin_range>
<bin_range>
<from>51724600000</from>
<to>51724699999</to>
<effective_from_date>2018-03-13</effective_from_date>
<effective_to_date>2018-08-15</effective_to_date>
<status>INACTIVE</status>
</bin_range>
<bin_range>
<from>51724700000</from>
<to>51724799999</to>
<effective_from_date>2018-03-13</effective_from_date>
<effective_to_date>2018-08-15</effective_to_date>
<status>INACTIVE</status>
</bin_range>
Ce que je souhaite, c'est remplacer uniquement les chaines de type: <from>51724600000 (<from>ET_11_CHIFFRES) par <from>517246 (<from>ET_6_CHIFFRES)
Ainsi, la sortie suite a ma commande unix serait :
<bin_range>
<from>516146</from>
<to>516146</to>
<effective_from_date>2018-08-06</effective_from_date>
<status>ACTIVE</status>
</bin_range>
<bin_range>
<from>517246</from>
<to>51724699999</to>
<effective_from_date>2018-03-13</effective_from_date>
<effective_to_date>2018-08-15</effective_to_date>
<status>INACTIVE</status>
</bin_range>
<bin_range>
<from>517247</from>
<to>51724799999</to>
<effective_from_date>2018-03-13</effective_from_date>
<effective_to_date>2018-08-15</effective_to_date>
<status>INACTIVE</status>
</bin_range>
J'avais pensé a une commande de ce type :
sed -i "s/<from>\([0-9]\{11\}\)/<from>\1/g" test1.xml
mais cette commande ne fait rien en fait, car je n'arrive pas a enlever les 5 derniers chiffres ... et je vous l'assure, je galere severe ;-)
Pourtant, une petite voix me dit que ca doit pas etre si compliqué !
Merci d'avance aux ames charitables !
A voir également:
- Rechercher et remplacer par plus court
- Rechercher et remplacer word - Guide
- Remplacer disque dur par ssd - Guide
- Rechercher ou entrer l'adresse - Guide
- Rechercher par image - Guide
- Remplacer coco - Accueil - Réseaux sociaux
2 réponses
Salut,
T'étais pas loin ;-))
T'étais pas loin ;-))
$ sed '/<from>/{s/\([[:digit:]]\{6\}\)[^<]*/\1/}' f1
<bin_range>
<from>516146</from>
<to>516146</to>
<effective_from_date>2018-08-06</effective_from_date>
<status>ACTIVE</status>
</bin_range>
<bin_range>
<from>517246</from>
<to>51724699999</to>
<effective_from_date>2018-03-13</effective_from_date>
<effective_to_date>2018-08-15</effective_to_date>
<status>INACTIVE</status>
</bin_range>
<bin_range>
<from>517247</from>
<to>51724799999</to>
<effective_from_date>2018-03-13</effective_from_date>
<effective_to_date>2018-08-15</effective_to_date>
<status>INACTIVE</status>
</bin_range>
MERCI !!!
lol, j'etais just a 2 annees lumiere de la soluce la ;-)