Aide fonction sed sous linux (encore un )

Résolu
rhum -  
 rhum -
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.
Configuration: Linux
Firefox 2.0.0.16

5 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  3. rhum
     
    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
  4. rhum
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. rhum
     
    ç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