Rechercher et remplacer par plus court

Fermé
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018 - Modifié le 18 sept. 2018 à 11:34
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018 - 18 sept. 2018 à 14:22
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 :

                <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 !

2 réponses

UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157
18 sept. 2018 à 11:45
Salut,

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>

1
Cobalt2225 Messages postés 19 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 11 décembre 2018
18 sept. 2018 à 14:22
Incroyable, ca marche en plus !
MERCI !!!

lol, j'etais just a 2 annees lumiere de la soluce la ;-)
0
Utilisateur anonyme
18 sept. 2018 à 11:44
salut,

normal, tu dis à sed de conserver 11 chiffres.
0