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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
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?article1&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
Gilles
Le #22643931
Ref:

Et on peut variabliliser de remplacement:



s/de/le/g
--
Gilles
Olivier Miakinen
Le #22644011
Le 04/10/2010 16:20, Gilles a écrit :
Ref:

Et on peut variabliliser de remplacement:



s/de/le/g



Et s/lili/ili/

;-)
Marc Boyer
Le #22643911
Le 04-10-2010, Punky Brewster
Le Mon, 04 Oct 2010 15:09:27 +0200, Olivier Miakinen a écrit :

Merci à tous pour les réponses, j'y suis presque (avec l'exemple réel qui
inclus des points):



Sauf que ton exemple réel ne correspond pas à ce que tu as demandé.
Ici, les deux principales différences sont:
1) il y a un espace entre ton mot clé et ce que tu veux modifier
2) il y a des points dans le truc à remplacer

% echo '"telephone": 06.07.44.44.44' | sed 's/"telephone": [.0-9]*/"telephone": 0892.11.11.11/'
"telephone": 0892.11.11.11

--
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?article1&id_mot0
Punky Brewster
Le #22644341
Le Mon, 04 Oct 2010 16:30:37 +0200, Olivier Miakinen a écrit :

Le 04/10/2010 15:53, Punky Brewster m'a répondu :

"s/("parametre1")=[0-9]*/1345/g"



Merci à tous pour les réponses, j'y suis presque (avec l'exemple réel
qui inclus des points):



... et une espace !

# 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



Euh... tu es sûr de ça ? Tu as fait un copier-coller ou bien tu as
recopié à la main ? En principe, ça devrait donner :

"telephone": 0892.11.11.11 06.07.44.44.44

La chaîne est ajoutée au lieu de remplacer ?



C'est parce que tu n'as pas inclus l'espace et le point dans ta regexp.
Essaye par exemple :
"s/("telephone"): [0-9.]*/1: 0892.11.11.11/"
(sans le g, comme le fait très justement remarquer Gilles)

Ou bien prends l'exemple donné directement par Gilles, il me semble très
bien aussi.



Ça y est :) Merci beaucoup. Voici la commande finale :

"s/("Telephone"): "[0-9.]*",/1: "0892.11.11.11",/"

qui me retourne :
"Telephone": "0891.11.11.11",

Alors puisqu'ici tout le monde est sympa j'ai une dernière question (je
viens d'y passer 45 minutes sans succès) :

Comment faire :
sed -i "s/("Telephone"): "[0-9.]*",/1: "$variable",/"
(comment remplacer le numéros de tel par une variable qui au final, doit-
être entre guillemets ?)
J'ai essayé tel quel, ou avec des simples quotes.
Gilles
Le #22644371
Ref:
Le Mon, 04 Oct 2010 16:30:37 +0200, Olivier Miakinen a écrit :


Comment faire :
sed -i "s/("Telephone"): "[0-9.]*",/1: "$variable",/"
(comment remplacer le numéros de tel par une variable qui au final, doit-
être entre guillemets ?)
J'ai essayé tel quel, ou avec des simples quotes.



Un poil adapté de la réponse que j'avais donné tout a l'heure:

telnum="<nouveau numéro>"
sed -i -e '/"^telephone":/s/:.*$/: "'$telnum'"/'

Je ne pense pas pouvoir faire plus court (et sans parenthèses ni backreference
:) )
--
Gilles
Publicité
Poster une réponse
Anonyme