GNT sans publicité, site mobile, fonctionnalitées exclusives...

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
Lire les 12 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #22643741
Bonjour,

Le 04/10/2010 14:28, Punky Brewster a écrit :

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



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'

Mais, la valeur d'origine du paramètre1 (ici 45678) n'est pas toujours
identique. Comment faire pour remplacer la ligne contenant simplement
"parametre1" ?



Ç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
Marc Boyer
Le #22643731
Le 04-10-2010, 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" {} ;




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
DeVice
Le #22643771
Punky Brewster a écrit :
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



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
Punky Brewster
Le #22643851
Le Mon, 04 Oct 2010 15:09:27 +0200, Olivier Miakinen a écrit :

Bonjour,

Le 04/10/2010 14:28, Punky Brewster a écrit :

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



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'

Mais, la valeur d'origine du paramètre1 (ici 45678) n'est pas toujours
identique. Comment faire pour remplacer la ligne contenant simplement
"parametre1" ?



Ç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,



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 ?
Gilles
Le #22643941
Ref:
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
Publicité
Suivre les réponses
Poster une réponse
Anonyme