Rechercher et remplacer par plus court

Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -
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 !
A voir également:

2 réponses

UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   158
 
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   Statut Membre Dernière intervention  
 
Incroyable, ca marche en plus !
MERCI !!!

lol, j'etais just a 2 annees lumiere de la soluce la ;-)
0
Utilisateur anonyme
 
salut,

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