Sed : remplacer une ligne contenant
Le
Punky Brewster
Bonjour
Avec sed je souhaite remplacer une ligne contenant un terme connu. Voici
où j'en suis :
sed -i "s/\"parametre1\"E678/\"parametre1\"345/g" {} \;
Qui en fait remplace
"parametre1"E678
par
"parametre1"345
Mais, la valeur d'origine du paramètre1 (ici 45678) n'est pas toujours
identique. Comment faire pour remplacer la ligne contenant simplement
"parametre1" ?
Merci
Avec sed je souhaite remplacer une ligne contenant un terme connu. Voici
où j'en suis :
sed -i "s/\"parametre1\"E678/\"parametre1\"345/g" {} \;
Qui en fait remplace
"parametre1"E678
par
"parametre1"345
Mais, la valeur d'origine du paramètre1 (ici 45678) n'est pas toujours
identique. Comment faire pour remplacer la ligne contenant simplement
"parametre1" ?
Merci

Poser une question


Le 04/10/2010 14:28, Punky Brewster a écrit :
Note que tu peux simplifier :
"s/"parametre1"E678/"parametre1"345/g"
en :
"s/("parametre1")E678/1345/g"
À la limite tu pourrais même y inclure le « = » mais je trouve ça un peu
moins lisible (question de goût, uniquement).
En revanche, si tu n'as pas de contrainte externe sur le choix des
guillemets pour le shell, ça pourrait même être :
's/("parametre1")E678/1345/g'
Ça c'est une question pour fr.comp.lang.regexp !
Tu peux par exemple remplacer 45678 par [0-9]* ce qui prendra n'importe
quelle chaîne de chiffres, quelle que soit leur longueur (même vide). Si
tu as des besoins plus précis, par exemple chaîne de longueur 5
uniquement, ou bien obliger la présence d'au moins un chiffre, n'hésite
pas à demander.
Donc :
"s/("parametre1")=[0-9]*/1345/g"
Cordialement,
--
Olivier Miakinen
sed -i "s/"parametre1"=[0-9]*/"parametre1"345/g"
(pas testé, mais l'idée est là).
Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?a...amp;id_mot0
Si il ne peut y avoir que des chiffres dans tes paramètres 1 :
sed -i 's/"parametre1"=[0-9]*/"parametre1"345/'
"[0-9]*" signifie "une suite de caractères compris entre 0 et 9".
le paramêtre "g" en fin de commande sed n'est utile que si tu peux avoir
plusieurs remplacements à faire dans une seule ligne.
man sed et man regex peuvent t'aider pour plus d'élaboration.
--
DeVice
Merci à tous pour les réponses, j'y suis presque (avec l'exemple réel qui
inclus des points):
# cat client |grep telephone
"telephone": 06.07.44.44.44
sed -i "s/("telephone"):[0-9]*/1: 0892.11.11.11/g" {} ;
# cat client |grep telephone
"telephone": 06.07.44.44.44 0892.11.11.11
La chaîne est ajoutée au lieu de remplacer ?
Et pourquoi pas, tout simplement:
sed -i -e '/"^telephone":/s/:.*$/:0892.11.11.11/'
Et on peut variabliliser de remplacement:
numtel="0892.11.11.11"
sed -i -e '/"^telephone":/s/:.*$/:'$numtel'/'
Ce qui peut se traduire par "pour toutes les lignes commençant par la chaîne
"telephone:", remplacer à partir du premier caractère ":" jusqu'a la fin de
ligne par ":0892.11.11.11"
PS: que font ici les arguments {} ;, ça sent le "find ... -exec" : je me
trompe?
--
Gilles