Aide fonction sed sous linux (encore un )

Résolu/Fermé
rhum - 8 sept. 2008 à 22:16
 rhum - 9 sept. 2008 à 23:21
Bonjour,

j'ai un petit probleme pour utiliser la fonction sed sous linux

objectif :


automatiser la modification les parametre d'un fichier de configuration

dans un script en clair dans un fichier config.txt je cherche madifier une ligne existante


ligne d'origine :

tm_execsetting name_on_plugin_load "nom avant modification"


ligne finale :

tm_execsetting name_on_plugin_load "nom que j ai choisi"

sachant que mon script ne connais pas le "nom avant modification"


je procede ainsi:

CHG=`grep "tm_execsetting name_on_plugin_load" config.txt`

sed -e 's/${CHG}/"tm_execsetting name_on_plugin_load \"le nom que j ai choisi\"/g' "config.txt" > "config.tmp"

mv -f config.tmp config.txt

je pense que mon probleme viens du fait que la partie de la ligne que je ne connais aps contient des "

j'ai tenté toute sorte de syntaxe au dans le meilleur des cas cela ne modifie rien dans le fichier et dans le pire des cas me modifie toutes les lignes ou il y a tm_execsetting

soit 1/3 des ligne du fichier de config


ça fais quelques heures que je cours apres la solution mais je suis plus un bidouilleur qu'un pro de la programmation donc je lance mon appel au secours.
A voir également:

5 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
9 sept. 2008 à 22:54
Il faut entourer l'expression par des quotes doubles pour que la variable soit interprétée :
[tmpfs]$ cat fich
tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_ "nom avant modification"

[tmpfs]$ nom="nom que j'ai choisi"
[tmpfs]$ echo $nom
nom que j'ai choisi

[tmpfs]$ sed "/tm_execsetting name_on_plugin_load/ s/nom avant modification/$nom/" fich
tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "nom que j'ai choisi"
tm_execsetting name_on_plugin_ "nom avant modification"

[tmpfs]$
Voir : http://www.commentcamarche.net/faq/sujet 9559 sed introduction a sed part ii#le remplacement de variables


;-))
2
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
8 sept. 2008 à 22:31
Salut,
[tmpfs]$ cat le_fich
tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_ "nom avant modification"

[tmpfs]$ sed 's/\(tm_execsetting name_on_plugin_load \).*/\1"nom que j ai choisi"/' le_fich
tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "nom que j ai choisi"
tm_execsetting name_on_plugin_ "nom avant modification"

Si tu veux que le changement soit effectif, utilise l'option "-i" de sed, modification en place, et avec "-i.bak" tu obtiens même une sauvegarde du fichier original...
[tmpfs]$ cat le_fich
tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_ "nom avant modification"

[tmpfs]$ sed -i.bak 's/\(tm_execsetting name_on_plugin_load \).*/\1"nom que j ai choisi"/' le_fich

[tmpfs]$ cat le_fich
tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "nom que j ai choisi"
tm_execsetting name_on_plugin_ "nom avant modification"

[tmpfs]$ 
Voir dans la FAQ les pages consacrées à SED ;-))
1
en fait l'expression (tm_execsetting name_on _plugin_load).* veut dire que je garde tout ce qui est en tre parenthese et que je le replace le reste * par le contenu de l'autre slash ??

g pas trop saisi pourquoi vous avze mis de /\ mais ça je vais reprends le tuto a fond pour bien saisir

jevais bosser et ce soir je met en palce ma fonction vous etes super :)

merci beaucoup
1
désolé pour le double post mais il c'est ecoulé quelques heures

et

g encore un probleme

car le script que je veux creer change "nom avant modofication" par "nom que j'ai choisi" or nom que g choisi est une variable

ainsi je demare mon script comme ceci ./monscript "nom que j'ai choisi"

et au debut de mon script je declare ma variable avec :

[code]
#/bin/bash

nom=$1

sed -i.bak 's/\(tm_execsetting name_on_plugin_load \).*/\1\"$nom\"/' le_fich

[/code]

rhum@bureau$ ./monscript "nom que j'ai choisi"
rhum@bureau$ cat le_fich

tm_setting name_on_plugin_load "nom avant modification"
tm_execsetting name_on_plugin_load "$nom"
tm_execsetting name_on_plugin_ "nom avant modification"
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ça y es cette fois j'ai reussi

en plus en suivant le lien en bas de ton post g compris comment integrer la variable de maniere plus generale

je doit avouer que j'avais lu en diagonale et que g pas fais gaffe que yavais tout un paragraphe dedié a l'introduction de variable dans la commande (:honte)

par contre pour que ça fonctionne g utilisé la l'expression de ta reponse d'hier soir

\(tm_execsetting name_on_plugin_load \).*


enfin merci beaucoup vraiment la maintenant ça fonctionne nikel
1