# Remplacer un texte dans un fichier avec une variable contenant le caractère \\n

**URL:** <https://www.debian-fr.org/t/remplacer-un-texte-dans-un-fichier-avec-une-variable-contenant-le-caractere-n/90338>\
**Category:** Support Debian\
**Created:** [Septembre 18, 2024, 10:00 UTC](https://www.debian-fr.org/t/remplacer-un-texte-dans-un-fichier-avec-une-variable-contenant-le-caractere-n/90338 "2024-09-18T10:00:56Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Septembre 18, 2024, 10:00 UTC](https://www.debian-fr.org/t/remplacer-un-texte-dans-un-fichier-avec-une-variable-contenant-le-caractere-n/90338/1 "2024-09-18T10:00:56Z")

</div>

Bonjour,

j’ai un fichier qui contient:

```auto
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text='du texte ici'

```

Je veux remplacer la partie

```auto
banner-message-text='du texte ici'

```

par

```auto
banner-message-text='This system is for the use of authorized users only.\n\nAll connections are monitored and recorded.\nAnyone using this system expressly consents to such monitoring\nand is advised that if such monitoring reveals possible\nevidence of criminal activity, system personnel may provide the\nevidence from such monitoring to law enforcement officials.\n\n!!! Disconnect IMMEDIATELY if you are not an authorized user. !!! \n\nAll requests can be sent to admin@enedwaith.org'

```

J’ai essayé avec `sed` mais sans succès.  
J’ai d’abord créé une variable

```auto
message="This system is for the use of authorized users only.\n\nAll connections are monitored and recorded.\nAnyone using this system expressly consents to such monitoring\nand is advised that if such monitoring reveals possible\nevidence of criminal activity, system personnel may provide the\nevidence from such monitoring to law enforcement officials.\n\n!!! Disconnect IMMEDIATELY if you are not an authorized user. !!! \n\nAll requests can be sent to admin@enedwaith.org"

```

si je veux écrire directement dans un fichier, ça marche très bien avec `printf`.  
Mais si je veux faire un remplacement je n’y arrive pas.  
Il semble que `sed` ne soit pas le bon outil, et je ne maitrise pas `awk`.  
Avec sed je faisais:

```auto
sed -E 's,(banner-message-text=).*,\1'"$message"',g' fichier.txt

```

ou

```auto
sed -E 's,(banner-message-text=).*,\1$message,g' fichier.txt

```

Mais systématiquement il interprète les `\n` dans le texte et cela conduit à un message d’erreur du type

```auto
sed: -e expression n°1, caractère 82: commande « s » inachevée

```

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Septembre 18, 2024, 10:24 UTC](https://www.debian-fr.org/t/remplacer-un-texte-dans-un-fichier-avec-une-variable-contenant-le-caractere-n/90338/2 "2024-09-18T10:24:41Z")

</div>

Salut,

```auto
$ cat test.txt 
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text='du texte ici'

```

Si tu veux que les sauts de ligne soient interprétés:

```auto
$ sed -E 's/(banner-message-text=).*$/\1message avec un \nsaut de ligne/' test.txt 
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text=message avec un 
saut de ligne

```

Si tu veux qu’ils ne soient pas interprétés, tu peux échapper `\n` avec un autre `\`:

```auto
$ sed -E 's/(banner-message-text=).*$/\1message avec un \\nsaut de ligne/' test.txt 
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text=message avec un \nsaut de ligne

```

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Septembre 18, 2024, 10:49 UTC](https://www.debian-fr.org/t/remplacer-un-texte-dans-un-fichier-avec-une-variable-contenant-le-caractere-n/90338/3 "2024-09-18T10:49:49Z")

</div>

Le texte est assez long, donc j’utilise une variable à la place, et c’est apparemment là que le problème se pose.

Le soucis aussi c’est que dans la chaîne il y a des caractère **’** en début et fin de message.

De fait le `sed` utilise alors des " au lieu de ’ mais les saut de ligne sont interprétés.  
si j’utilise les ’ pour délimiter la commande `sed`, alors je ne peux plus utiliser les ’ dans ma chaîne de remplacement.

Car, dans le fichier, le texte est encadré par des ’

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Septembre 18, 2024, 11:19 UTC](https://www.debian-fr.org/t/remplacer-un-texte-dans-un-fichier-avec-une-variable-contenant-le-caractere-n/90338/4 "2024-09-18T11:19:01Z")

</div>

j’ai finalement trouvé.

Il faut remplacer les `\n` par `\\\n` (il faut échapper aussi bien le \ que le n).  
Et pour pouvoir ajouter les ’ j’utilise \x27 en guise d’échappement.

Ce qui donne pour le fichier 01-banner-message:

```auto
:~# cat 01-banner-message 
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text='toto'

```

et la substitution:

```auto
:~# sed -E 's/(banner-message-text=).*/\1\x27'"${message}"'\x27/g' 01-banner-message
[org/gnome/login-screen]
banner-message-enable=true
banner-message-text='This system is for the use of authorized users only.\n\nAll connections are monitored and recorded.\n\nAnyone using this system expressly consents to such monitoring\nand is advised that if such monitoring reveals possible\nevidence of criminal activity, system personnel may provide the\nevidence from such monitoring to law enforcement officials.\n\n ! Disconnect IMMEDIATELY if you are not an authorized user. ! \n\nAll requests can be sent to admin@enedwaith.org'

```

Merci pour le coup de main.

- PS: deux heures et demi de recherches pour juste une ligne de sed 😉
