Rechercher et remplacer par plus court

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 :

                <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 1468 Statut Contributeur 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 24 Statut Membre
 
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