Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Sed : remplacer une ligne contenant

12 réponses
Avatar
Punky Brewster
Bonjour

Avec sed je souhaite remplacer une ligne contenant un terme connu. Voici
où j'en suis :

sed -i "s/\"parametre1\"=45678/\"parametre1\"=12345/g" {} \;

Qui en fait remplace
"parametre1"=45678
par
"parametre1"=12345

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

10 réponses

1 2
Avatar
Olivier Miakinen
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
Avatar
Marc Boyer
Le 04-10-2010, 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" {} ;




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
Avatar
DeVice
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
Avatar
Punky Brewster
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 ?
Avatar
Gilles
Ref: de Punky Brewster
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
Avatar
Gilles
Ref: de Gilles

Et on peut variabliliser de remplacement:



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

Et on peut variabliliser de remplacement:



s/de/le/g



Et s/lili/ili/

;-)
Avatar
Marc Boyer
Le 04-10-2010, Punky Brewster a écrit :
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
Avatar
Punky Brewster
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.
Avatar
Gilles
Ref: de Punky Brewster
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
1 2