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

Bonjour,

j’ai un fichier qui contient:

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

Je veux remplacer la partie

banner-message-text='du texte ici'

par

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

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:

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

ou

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

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

Salut,

$ 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:

$ 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 \:

$ 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

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 ’

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:

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

et la substitution:

:~# 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 :wink:
2 J'aime