SED remplacer mot exact

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

Comment faire pour remplacer uniquement LogFile=

Merci

Je suppose que ton “LogFile=” est en début de ligne, de même pour tes “PurgeLogFile=”, 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 “LogFile”, donc mettre un “\nLogFile=” ou un truc du genre, je ne suis pas spécialiste de SED. :mrgreen:

Non cela ne change rien :unamused:

Voici mon sed actuel

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

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.

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 :

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

Tu veux remplacer quoi par quoi ?

Remplacer LogFile= par LogFile=ce que je veux
sed -e “s@^LogFile=@LogFile=”${User}/logs/access.log"@"

Mais comme dans le fichier il existe aussi un PurgeLogFile= je ne veux pas qu’il soit modifié :119

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”

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)

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

Le résultat doit être :

Pour tester :

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:

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

sed.sourceforge.net/sed1line_fr.html

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 \

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.

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

[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]

Arf :079

J’avais oublié le \ dans “/chemin”@g"

Maintenant cela fonctionne bien :041

Merci syam pour la correction :023

Pas de souci. :wink:

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 :

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

Merci :wink:

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

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.