# SED et remplacement valeur

**URL:** <https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827 "2016-02-21T03:18:47Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/1 "2016-02-21T03:18:47Z")

</div>

Bonjour,

Je voudrais remplacer une valeur présente dans un fichier de configuration :

[quote]Conf1=YES  
Conf2=10[/quote]

Comment faire pour modifier Conf1=NO ?

J’ai essayer plusieurs techniques mais sans succès ![:doh:](https://www.debian-fr.org/uploads/default/original/1X/78536cf08b5cbccb06a10e44ddb8da50bfc1554d.gif "Doh!")

Merci

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/2 "2016-02-21T03:18:47Z")

</div>

Voici mon extrait SED :

[quote]VAL=new\_val  
sed -i ‘s/^Conf1=.\*/Conf1=$VAL/’ /etc/fichier.conf[/quote]

J’ai l’impression que sed n’évalue pas ma variable VAL 😕

---

<div class="post-metadata">

**Author:** ![Niloo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/n/c37758/32.png) [@Niloo](https://www.debian-fr.org/u/Niloo)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/3 "2016-02-21T03:18:47Z")

</div>

De mémoire, entre simples quotes (’) les variables ne sont pas interprétées.  
Essaie avec des doubles quotes :

`VAL=new_val
sed -i "s/^Conf1=.*/Conf1=$VAL/" /etc/fichier.conf`

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/4 "2016-02-21T03:18:47Z")

</div>

Le problème ne vient pas de sed, mais du fait que le shell n’évalue pas les variables quand elles sont à l’intérieur de guillemets simples (apostrophes).

Il faut refermer les guillemets pour que la variable soit traitée. Dans la cas où la valeur contenue dans ta variable contient des espaces, il faut aussi entourer la variable par des guillemets doubles.

`VAL="VALEUR AVEC DES ESPACES DEDANS"
sed -i 's/^Conf1=.*/Conf1='"$VAL"'/' /etc/fichier.conf`

Edit : Niloo, le souci (de mon point de vue) avec les guillemets doubles c’est que plein d’autres caractères risquent d’être interprétés différemment. Peut-être pas dans ce cas précis, mais en règle générale sed a besoin de caractères assez exotiques, d’où le fait qu’on préfère quasiment tout le temps utiliser des guillemets simples… C’est pourquoi je préfère utiliser la méthode ci-dessus : une seule syntaxe à retenir pour les expressions régulières (dans les guillemets simples) et une exception, toujours la même, pour insérer des variables. Après, chacun sa méthode préférée bien sûr. 🙂

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/5 "2016-02-21T03:18:47Z")

</div>

Bonjour et merci pour les réponses.

J’avais essayé avec les guillemets mais j’obtiens une erreur : sed: -e expression n°1, caractère 30: option inconnue pour `s’

Que j’utilise les “” ou ‘’ j’ai la même erreur ![:shifty:](https://www.debian-fr.org/uploads/default/original/1X/c2c6b2db4f768c7bf93cea265ed4e2c63ae01880.gif "Shifty")

---

<div class="post-metadata">

**Author:** ![LeDub](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/85f322/32.png) [@LeDub](https://www.debian-fr.org/u/LeDub)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/6 "2016-02-21T03:18:50Z")

</div>

Bonjour,  
Et avec un “!” en remplacement de “/” pour faire cela :

```auto
VAL="VALEUR AVEC DES ESPACES DEDANS"
sed -i 's!^Conf1=.*!Conf1='"$VAL"'!' /etc/fichier.conf
```

Ça donne quoi ?

LeDub pas motivé par son taff, aujourd’hui !!

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/7 "2016-02-21T03:18:50Z")

</div>

Idem… J’avais déjà modifié le séparateur au cas où 😢

---

<div class="post-metadata">

**Author:** ![LeDub](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/85f322/32.png) [@LeDub](https://www.debian-fr.org/u/LeDub)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/8 "2016-02-21T03:18:50Z")

</div>

C’est quoi ton shell ?  
Chez moi cela fonctionne :

[code]  
$ cat fichier.conf  
Conf1=YES  
Conf2=10

$ cat [truc.sh](http://truc.sh)  
#!/bin/bash  
VAL=“VALEUR AVEC DES ESPACES DEDANS"  
sed -i ‘s!^Conf1=.\*!Conf1=’”$VAL"’!’ fichier.conf

$ ./truc.sh  
$ cat fichier.conf  
Conf1=VALEUR AVEC DES ESPACES DEDANS  
Conf2=10[/code]

LeDub qui aime bien quand on sed

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/9 "2016-02-21T03:18:50Z")

</div>

> [@LeDub](#):
>
> C’est quoi ton shell ?

Testé avec bash et dash chez moi, sans souci…

Peut-être la valeur elle-même pose des problèmes (selon les caractères qu’elle contient) ? Mais bon si c’est bien «&nbsp;NO&nbsp;» que tu veux mettre, je fais clairement fausse route là. ![:005](https://www.debian-fr.org/uploads/default/original/1X/cdd45e7dd754015ac5291329b843a2851a0d4fe8.gif "chaud")

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/10 "2016-02-21T03:18:51Z")

</div>

J’ai une piste mais je ne comprends pas pourquoi ![:119](https://www.debian-fr.org/uploads/default/original/1X/0287f377b0e103e172422ffbbe8c639fd3e12c9e.gif "vertige") … En fait voici comment je procéde :

data=«&nbsp;HOME = /home/user/test&nbsp;»

# Récupération du chemin du Home

HOME1=$data

# Extraction du chemin

HOME1=«&nbsp;${HOME1#\*HOME = }&nbsp;»  
HOME1=«&nbsp;${HOME1%% \*}&nbsp;»

sed -i ‹&nbsp;s!^Conf3=.\*!Conf3=&nbsp;›«&nbsp;$HOME1&nbsp;»‹&nbsp;!&nbsp;› /etc/fichier.conf

Quand j’utilise $HOME1 j’ai l’erreur sed. Si je remplace $HOME1 par une autre variable, je n’ai pas de problème : mavar=«&nbsp;/etc/test/&nbsp;»

Une idée ?

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/11 "2016-02-21T03:18:52Z")

</div>

Ça va pas te plaire ça : je viens de tester ton bout de script (avec bash et dash), aucun problème. ![:017](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit")

Essaye peut-être avec ${HOME1} au lieu de $HOME1 ?? Je doute un peu mais bon sait-on jamais…

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/12 "2016-02-21T03:18:53Z")

</div>

😢

Suite au post : [awk-traiter-le-retour-d-une-page-web-t34933.html](http://www.debian-fr.org/awk-traiter-le-retour-d-une-page-web-t34933.html)

J’ai une page HTML qui me renvoie une serie de valeur que je récupère avec : data=$(w3m -dump [192.168.1.50/test.php](http://192.168.1.50/test.php))

et le reste du script qui traite les valeurs :

data=$(w3m -dump [192.168.1.50/test.php](http://192.168.1.50/test.php))

# Récupération du chemin du Home =\> HOME = /home/user/test

HOME1=$data

# Extraction du chemin

HOME1=«&nbsp;${HOME1#\*HOME = }&nbsp;»  
HOME1=«&nbsp;${HOME1%% \*}&nbsp;»

sed -i ‹&nbsp;s!^Conf3=.\*!Conf3=&nbsp;›«&nbsp;$HOME1&nbsp;»‹&nbsp;!&nbsp;› /etc/fichier.conf

Je ne comprends pas pourquoi sed ne veut pas des valeurs provenant de la variable data

Par contre sed marche si j’écris data=«&nbsp;HOME = /home/user/test&nbsp;»

![:013](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere")

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/13 "2016-02-21T03:18:53Z")

</div>

Aaaaah, on arrive au fond du problème petit à petit ! 😃

Après tests rapides, si tu as un retour chariot à la fin de la ligne HOME = … dans $data (qu’il y ait ou non d’autres données après ce retour chariot) alors ça coince.

Edit :

[code]#!/bin/dash

data=«&nbsp;PLEIN DE BAZAR  
HOME = /home/user/test  
ENCORE PLUS DE BAZAR&nbsp;»

# Récupération du chemin du Home

HOME1=«&nbsp;$(echo «&nbsp;$data&nbsp;» | grep -m 1 «&nbsp;HOME =&nbsp;» | sed ‹&nbsp;s@HOME \*= _([^]_)@\1@&nbsp;›)&nbsp;»

sed -i ‹&nbsp;s!^Conf3=.\*!Conf3=&nbsp;›«&nbsp;$HOME1&nbsp;»‹&nbsp;!&nbsp;› ./fichier.conf[/code]  
Je sais, je contourne le problème avec mon echo | grep | sed… ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/14 "2016-02-21T03:18:53Z")

</div>

Oui petit à petit mais c’est un vrai casse-tête ![:005](https://www.debian-fr.org/uploads/default/original/1X/cdd45e7dd754015ac5291329b843a2851a0d4fe8.gif "chaud")

Je ne pense pas avoir d’autre infos après le chemin du home. ![:think:](https://www.debian-fr.org/uploads/default/original/1X/98cae0704aea0201d04f151843e80a3ecd391eca.gif "Think")

Si je fais un echo $HOME1 j’obtiens bien mon chemin et rien d’autre, idem pour les autres variables…

Comment puis-je vérifier s’il ne traine pas un RC ou autre ?

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/15 "2016-02-21T03:18:54Z")

</div>

J’utilise souvent ça pour déboguer ce genre de cas :

```auto

```

Tu verras directement si les tirets sont collés au texte ou non.

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/16 "2016-02-21T03:18:54Z")

</div>

Héhé ![:041](https://www.debian-fr.org/uploads/default/original/1X/bfe857c9119752799c3eac55ca37a50312c51282.gif "applaudit")  
Effectivement j’ai bien un RC…Méaculpa !

Existe t’il une fonction qui permet de nettoyer une chaine et sortir un RC ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/17 "2016-02-21T03:18:54Z")

</div>

Au pire :

```auto

```

même si c’est vrai que le problème de sed est bizarre.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/18 "2016-02-21T03:18:55Z")

</div>

> [@\_seb\_](#):
>
> Existe t’il une fonction qui permet de nettoyer une chaine et sortir un RC ?

Voir mon bout de code plus haut, dans ce message : [sed-et-remplacement-valeur-t35103.html#p355752](https://www.debian-fr.org/sed-et-remplacement-valeur-t35103.html#p355752)  
(j’avais édité, tu l’as peut-être loupé)

Ou alors si tu tiens absolument à utiliser HOME1=«&nbsp;${HOME1#\*HOME = }&nbsp;» et HOME1=«&nbsp;${HOME1%% \*}&nbsp;» tu peux supprimer la partie sed dans mon exemple. Simplement, le grep -m 1 garantit que tu auras une ligne au plus, et sans retour chariot.

---

<div class="post-metadata">

**Author:** ![\_seb](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/_/90db22/32.png) [@\_seb](https://www.debian-fr.org/u/_seb)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/19 "2016-02-21T03:18:55Z")

</div>

Hum… Un bon début je n’ai plus de RC en fin de ma chaine mais par contre cela me rajoute j’ai l’impression des tabulations en début de chaine ![:think:](https://www.debian-fr.org/uploads/default/original/1X/98cae0704aea0201d04f151843e80a3ecd391eca.gif "Think")

[quote]  
– /home/user/test–[/quote]

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:18 UTC](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827/20 "2016-02-21T03:18:55Z")

</div>

Puisque ton ancienne méthode fonctionne bien pour enlever le début, utilise d’abord celle là puis seulement après tu t’occupes de supprimer le retour chariot. Du coup au lieu du grep tu peux utiliser head pour extraire uniquement la première ligne.

[code]#!/bin/sh  
data=“PLEIN DE BAZAR  
HOME = /home/user/test  
PLEIN DE BAZAR”

HOME1="$data"

# Extraction du chemin

HOME1="${HOME1#\*HOME = }“  
HOME1=”${HOME1%% \*}“  
HOME1=”$(echo “$HOME1” | head -n 1)"

echo “–$HOME1–”[/code]

[Page suivante](https://www.debian-fr.org/t/sed-et-remplacement-valeur/33827.md?page=2)
