SED et remplacement valeur

Bonjour,

Je voudrais remplacer une valeur présente dans un fichier de configuration :

[quote]Conf1=YES
Conf2=10[/quote]

Comment faire pour modifier Conf1=NO ?

J’ai essayer plusieurs techniques mais sans succès :doh:

Merci

Voici mon extrait SED :

[quote]VAL=new_val
sed -i ‘s/^Conf1=.*/Conf1=$VAL/’ /etc/fichier.conf[/quote]

J’ai l’impression que sed n’évalue pas ma variable VAL :confused:

De mémoire, entre simples quotes (’) les variables ne sont pas interprétées.
Essaie avec des doubles quotes :

VAL=new_val sed -i "s/^Conf1=.*/Conf1=$VAL/" /etc/fichier.conf

Le problème ne vient pas de sed, mais du fait que le shell n’évalue pas les variables quand elles sont à l’intérieur de guillemets simples (apostrophes).

Il faut refermer les guillemets pour que la variable soit traitée. Dans la cas où la valeur contenue dans ta variable contient des espaces, il faut aussi entourer la variable par des guillemets doubles.

VAL="VALEUR AVEC DES ESPACES DEDANS" sed -i 's/^Conf1=.*/Conf1='"$VAL"'/' /etc/fichier.conf

Edit : Niloo, le souci (de mon point de vue) avec les guillemets doubles c’est que plein d’autres caractères risquent d’être interprétés différemment. Peut-être pas dans ce cas précis, mais en règle générale sed a besoin de caractères assez exotiques, d’où le fait qu’on préfère quasiment tout le temps utiliser des guillemets simples… C’est pourquoi je préfère utiliser la méthode ci-dessus : une seule syntaxe à retenir pour les expressions régulières (dans les guillemets simples) et une exception, toujours la même, pour insérer des variables. Après, chacun sa méthode préférée bien sûr. :slightly_smiling:

Bonjour et merci pour les réponses.

J’avais essayé avec les guillemets mais j’obtiens une erreur : sed: -e expression n°1, caractère 30: option inconnue pour `s’

Que j’utilise les “” ou ‘’ j’ai la même erreur :shifty:

Bonjour,
Et avec un “!” en remplacement de “/” pour faire cela :

VAL="VALEUR AVEC DES ESPACES DEDANS"
sed -i 's!^Conf1=.*!Conf1='"$VAL"'!' /etc/fichier.conf

Ça donne quoi ?

LeDub pas motivé par son taff, aujourd’hui !!

Idem… J’avais déjà modifié le séparateur au cas où :cry:

C’est quoi ton shell ?
Chez moi cela fonctionne :

[code]
$ cat fichier.conf
Conf1=YES
Conf2=10

$ cat truc.sh
#!/bin/bash
VAL=“VALEUR AVEC DES ESPACES DEDANS"
sed -i ‘s!^Conf1=.*!Conf1=’”$VAL"’!’ fichier.conf

$ ./truc.sh
$ cat fichier.conf
Conf1=VALEUR AVEC DES ESPACES DEDANS
Conf2=10[/code]

LeDub qui aime bien quand on sed

Testé avec bash et dash chez moi, sans souci…

Peut-être la valeur elle-même pose des problèmes (selon les caractères qu’elle contient) ? Mais bon si c’est bien “NO” que tu veux mettre, je fais clairement fausse route là. :005

J’ai une piste mais je ne comprends pas pourquoi :119 … En fait voici comment je procéde :

data=“HOME = /home/user/test”

Récupération du chemin du Home

HOME1=$data

Extraction du chemin

HOME1="${HOME1#*HOME = }"
HOME1="${HOME1%% *}"

sed -i ‘s!^Conf3=.*!Conf3=’"$HOME1"’!’ /etc/fichier.conf

Quand j’utilise $HOME1 j’ai l’erreur sed. Si je remplace $HOME1 par une autre variable, je n’ai pas de problème : mavar="/etc/test/"

Une idée ?

Ça va pas te plaire ça : je viens de tester ton bout de script (avec bash et dash), aucun problème. :017

Essaye peut-être avec ${HOME1} au lieu de $HOME1 ?? Je doute un peu mais bon sait-on jamais…

:cry:

Suite au post : awk-traiter-le-retour-d-une-page-web-t34933.html

J’ai une page HTML qui me renvoie une serie de valeur que je récupère avec : data=$(w3m -dump 192.168.1.50/test.php)

et le reste du script qui traite les valeurs :

data=$(w3m -dump 192.168.1.50/test.php)

Récupération du chemin du Home => HOME = /home/user/test

HOME1=$data

Extraction du chemin

HOME1="${HOME1#*HOME = }"
HOME1="${HOME1%% *}"

sed -i ‘s!^Conf3=.*!Conf3=’"$HOME1"’!’ /etc/fichier.conf

Je ne comprends pas pourquoi sed ne veut pas des valeurs provenant de la variable data

Par contre sed marche si j’écris data=“HOME = /home/user/test”

:013

Aaaaah, on arrive au fond du problème petit à petit ! :smiley:

Après tests rapides, si tu as un retour chariot à la fin de la ligne HOME = … dans $data (qu’il y ait ou non d’autres données après ce retour chariot) alors ça coince.

Edit :

[code]#!/bin/dash

data=“PLEIN DE BAZAR
HOME = /home/user/test
ENCORE PLUS DE BAZAR”

Récupération du chemin du Home

HOME1="$(echo “$data” | grep -m 1 “HOME =” | sed ‘s@HOME *= ([^ ])@\1@’)"

sed -i ‘s!^Conf3=.*!Conf3=’"$HOME1"’!’ ./fichier.conf[/code]
Je sais, je contourne le problème avec mon echo | grep | sed:033

Oui petit à petit mais c’est un vrai casse-tête :005

Je ne pense pas avoir d’autre infos après le chemin du home. :think:

Si je fais un echo $HOME1 j’obtiens bien mon chemin et rien d’autre, idem pour les autres variables…

Comment puis-je vérifier s’il ne traine pas un RC ou autre ?

J’utilise souvent ça pour déboguer ce genre de cas :

Tu verras directement si les tirets sont collés au texte ou non.

Héhé :041
Effectivement j’ai bien un RC…Méaculpa !

Existe t’il une fonction qui permet de nettoyer une chaine et sortir un RC ?

Au pire :

même si c’est vrai que le problème de sed est bizarre.

Voir mon bout de code plus haut, dans ce message : sed-et-remplacement-valeur-t35103.html#p355752
(j’avais édité, tu l’as peut-être loupé)

Ou alors si tu tiens absolument à utiliser HOME1="${HOME1#*HOME = }" et HOME1="${HOME1%% *}" tu peux supprimer la partie sed dans mon exemple. Simplement, le grep -m 1 garantit que tu auras une ligne au plus, et sans retour chariot.

Hum… Un bon début je n’ai plus de RC en fin de ma chaine mais par contre cela me rajoute j’ai l’impression des tabulations en début de chaine :think:

[quote]
– /home/user/test–[/quote]

Puisque ton ancienne méthode fonctionne bien pour enlever le début, utilise d’abord celle là puis seulement après tu t’occupes de supprimer le retour chariot. Du coup au lieu du grep tu peux utiliser head pour extraire uniquement la première ligne.

[code]#!/bin/sh
data=“PLEIN DE BAZAR
HOME = /home/user/test
PLEIN DE BAZAR”

HOME1="$data"

Extraction du chemin

HOME1="${HOME1#*HOME = }“
HOME1=”${HOME1%% *}“
HOME1=”$(echo “$HOME1” | head -n 1)"

echo “–$HOME1–”[/code]