# SED remplacer mot exact

**URL:** <https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829 "2016-02-21T13:51:38Z")\
**Posts on this page:** 19\
**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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/1 "2016-02-21T13:51:38Z")

</div>

Bonjour,

Je voudrais remplacer avec sed la variable suivante : LogFile=  
Dans mon fichier j’ai un autre mot qui lui ressemble : PurgeLogFile=

A chaque fois que j’utilise le remplacement, PurgeLogFile est modifié ![:079](https://www.debian-fr.org/uploads/default/original/1X/905412cc2e3f543d94c645aa4231b1f3197e2548.gif "flagelle")

Comment faire pour remplacer uniquement LogFile=

Merci

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/2 "2016-02-21T13:51:38Z")

</div>

Je suppose que ton «&nbsp;LogFile=&nbsp;» est en début de ligne, de même pour tes «&nbsp;PurgeLogFile=&nbsp;», non ?  
Donc pour eviter que le remplacement du premier n’empiète sur le deuxième je te propose de spécifier qu’il y a un retour à la ligne avant «&nbsp;LogFile&nbsp;», donc mettre un «&nbsp;\nLogFile=&nbsp;» ou un truc du genre, je ne suis pas spécialiste de SED. ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/3 "2016-02-21T13:51:38Z")

</div>

Non cela ne change rien 😒

Voici mon sed actuel

```auto
sed -e "s@LogFile=@LogFile=\"${User}/logs/access.log\"@"
```

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/4 "2016-02-21T13:51:38Z")

</div>

Mimoza a raison, le tout est de connaître le format exact de ton fichier pour pouvoir choisir la bonne ancre.  
Si c’est en début de ligne, ^LogFile= devrait faire l’affaire.

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/5 "2016-02-21T13:51:40Z")

</div>

Oui il s’agit d’un fichier de configuration. Chaque variable est sur une ligne :  
LogFile=  
PurgeLogFile=

J’ai déjà essayé le chapeau devant le mot mais rien ne change.

Je procéde de cette manière :

```auto
cat /var/www/model.conf | \
sed -e "s@^LogFile=@LogFile=\"${User}/logs/access.log\"@" | \
sed -e "s@Domain=@Domain=\"${Domain}\"@" > \
"/var/www/${Domain}.conf"
```

---

<div class="post-metadata">

**Author:** ![fluo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/e9bcb4/32.png) [@fluo](https://www.debian-fr.org/u/fluo)\
**Post date:** [Février 21, 2016, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/6 "2016-02-21T13:51:41Z")

</div>

Tu veux remplacer quoi par quoi ?

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/7 "2016-02-21T13:51:41Z")

</div>

Remplacer LogFile= par LogFile=ce que je veux  
sed -e «&nbsp;s@^LogFile=@LogFile="${User}/logs/access.log"@&nbsp;»

Mais comme dans le fichier il existe aussi un PurgeLogFile= je ne veux pas qu’il soit modifié ![:119](https://www.debian-fr.org/uploads/default/original/1X/0287f377b0e103e172422ffbbe8c639fd3e12c9e.gif "vertige")

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/8 "2016-02-21T13:51:41Z")

</div>

Sinon il y a la manière en 3 étapes :

1. Change “PurgeLogFile” par “PurgeLooogFile” (ou tout autre chose d’unique)
2. Faire ta substitution avec “LogFile”
3. Remettre “PurgeLogFile”

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/9 "2016-02-21T13:51:41Z")

</div>

Et si tu nous donnais le contenu _exact_ de ton fichier, histoire qu’on puisse tester nous-mêmes ?  
(je pensais que c’était évident dans mon message précédent)

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/10 "2016-02-21T13:51:41Z")

</div>

Bin rien de compliqué, un fichier constitué comme ceci :

> [@](#):
>
> # Configuration emplacent du log
> 
> LogFile=
> 
> # Configuration du domaine
> 
> Domain=
> 
> # Activer la suppression du log
> 
> PurgeLogFile=1

Le résultat doit être :

> [@](#):
>
> # Configuration emplacent du log
> 
> LogFile=«&nbsp;/var/www/test.net/logs/access.log&nbsp;»
> 
> # Configuration du domaine
> 
> Domain=«&nbsp;[test.net](http://test.net)&nbsp;»
> 
> # Activer la suppression du log
> 
> PurgeLogFile=1

---

<div class="post-metadata">

**Author:** ![fluo](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/e9bcb4/32.png) [@fluo](https://www.debian-fr.org/u/fluo)\
**Post date:** [Février 21, 2016, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/11 "2016-02-21T13:51:41Z")

</div>

Pour tester :

```auto
sed "s/^LogFile=/LogFile=\"\/var\/www\/test.net\/logs\/access.log\"/g" ./fichier
```

En écriture avec une sauvegarde de l’ancien (portant l’extension bak) en cas de problème:

```auto
sed -i.bak "s/^LogFile=/LogFile=\"\/var\/www\/test.net\/logs\/access.log\"/g" ./fichier
```

[sed.sourceforge.net/sed1line\_fr.html](http://sed.sourceforge.net/sed1line_fr.html)

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/12 "2016-02-21T13:51:42Z")

</div>

Alors comment passer le chemin contenant les / en variables ?  
Mon chemin est dynamique et construit à l’execution du script.

Parceque dans ton test FLUO, tu échappes les / par des \

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/13 "2016-02-21T13:51:42Z")

</div>

Ben c’est pas grave, remplace les délimiteurs / par des @ comme tu avais fait au départ, comme ça tu pourras utiliser des / dans les expressions sans avoir à les échapper. C’est pas ça qui changera quoi que ce soit au fonctionnement de la regex de toutes façons.

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/14 "2016-02-21T13:51:42Z")

</div>

J’ai l’erreur : option inconnue pour `s’

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/15 "2016-02-21T13:51:42Z")

</div>

[code]$ cat fichier

# Configuration emplacent du log

LogFile=

# Configuration du domaine

Domain=

# Activer la suppression du log

PurgeLogFile=1  
$ sed “s@^LogFile=@LogFile=”/foo/bar/baz"@g" fichier

# Configuration emplacent du log

LogFile="/foo/bar/baz"

# Configuration du domaine

Domain=

# Activer la suppression du log

PurgeLogFile=1[/code]

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/16 "2016-02-21T13:51:43Z")

</div>

Arf ![:079](https://www.debian-fr.org/uploads/default/original/1X/905412cc2e3f543d94c645aa4231b1f3197e2548.gif "flagelle")

J’avais oublié le \ dans «&nbsp;/chemin"@g&nbsp;»

Maintenant cela fonctionne bien ![:041](https://www.debian-fr.org/uploads/default/original/1X/bfe857c9119752799c3eac55ca37a50312c51282.gif "applaudit")

Merci syam pour la correction ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/17 "2016-02-21T13:51:43Z")

</div>

Pas de souci. 😉

PS : plutôt que de chaîner plusieurs commandes sed avec des pipe | tu peux appeler sed une seule fois et lui donner plusieurs expressions d’un coup :

```auto

```

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/18 "2016-02-21T13:51:45Z")

</div>

Oui pas faut, je n’avais pas pensé sur le coup à le faire!

Merci 😉

---

<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, 1:51 UTC](https://www.debian-fr.org/t/sed-remplacer-mot-exact/55829/19 "2016-02-21T13:51:46Z")

</div>

[quote=“syam”]PS : plutôt que de chaîner plusieurs commandes sed avec des pipe | tu peux appeler sed une seule fois et lui donner plusieurs expressions d’un coup :

```auto

```

Excuse-moi mais je trouve ça moche. Je préfère :

`sed -f <(cat <<EOF
s@regex1@remplace1@g
s@regex2@remplace2@g
s@regex3...@remplace3@g
EOF) original > nouveau`

Je trouve que c’est loin d’être parfait mais à part faire du perl il n’y a pas mieux (y compris en zsh). Avec le bourne shell je préfère créer un fichier temporaire, c’est toujours plus lisible.
