IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Problème avec le sed


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut Problème avec le sed
    Bonjour les amis,

    J'ai un truc qui me rend dingue.... Voilà le problème. A vrai dire j'ai deux problèmes:

    1er Problème:

    J'ai une fonction ChangeChar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function ChangeChar {
    	# Function: This function update char $1 with char $2
    	# List of parameters:
    	#          - $1: Char to be updated
    	#          - $2: New value of the char
    	#          - $3: File to be updated
    	# ------------------------------------
    	sed "s/^${1}=.*/${1}=${2}/" ${3} > ${3}.tmp
    	cp -f ${3}.tmp ${3}
    	rm -f  ${3}.tmp
    }
    Le problème c'est que quand le 2ème argument "${2}" est une chaine vide, il me donne des messages d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 40: unknown option to `s'
    pour régler ce problème j'ai fait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function ChangeChar {
    	# Function: This function update char $1 with char $2
    	# List of parameters:
    	#          - $1: Char to be updated
    	#          - $2: New value of the char
    	#          - $3: File to be updated
    	# ------------------------------------
    	if [ -z ${2} ]
    	then
    		sed "s/^${1}=.*/${1}=/" ${3} > ${3}.tmp
    	else 
    		sed "s/^${1}=.*/${1}=${2}/" ${3} > ${3}.tmp
    	fi
    	cp -f ${3}.tmp ${3}
    	rm -f  ${3}.tmp
    }
    mais ça ne règle pas le problème malheureusement.

    2eme Problème:
    ça concerne toujours la même fonction. En fait, avec cette fonction je parcours 3 fichiers, pour chacun, quand je trouve le pattern que je veux remplacer, et bien je le remplace sinon ça doit continuer le traitement sans générer d'erreur.

    Le soucis, c'est que, quand il parcours les 3 fichiers, et qu'il ne trouve pas un pattern dans l'un d'eux, il me générer un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 40: unknown option to `s'
    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    normal si une des variable n'est pas alimentée que ça plante.

    tu dois tester le contenu des variables avant le sed et si c'est sans valeur il faut la valoriser à null

    genre

    var=""

    ça t'obliges à changer un peu ton script pour ne pas utiliser directement $1/$2/$3 mais bon la bonne pratique est de ne jamais utiliser nativement les paramètres de toute façon et de les utiliser uniquement pour valoriser des variables qui elles tu as le droit de les passer à des commandes

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Il serait peut être mieux de nous montrer à quoi ressemble tes patterns ainsi que le contenu de ton fichier xxx.tmp, sans quoi malgré tous nos dons de voyance et autres boules de cristal, on coince un tantinet soit peu

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par azahiri Voir le message
    Le problème c'est que quand le 2ème argument "${2}" est une chaine vide, il me donne des messages d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 40: unknown option to `s'
    Alors je me lance pour le concours de boules de cristal!

    As-tu oublié de positionner le 'set -u' de rigueur?
    As-tu oublié de tester ton code en mode debug?
    As-tu utilisé ChangeChar sans guillemetiser les arguments?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ChangeChar  $a $b $c        # Pas bien !
    set -u                      # Bien !
    typeset -ft ChangeChar      # Bien !
    ChangeChar  "$a" "$b" "$c"  # Bien !
    J'ai gagné?

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Autre possibilité:
    Les variables 1 et 2 peuvent-elles contenir le séparateur que tu as choisi pour la substitution (/) ?
    Si oui, as-tu oublié de quoter ce caractère?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function ChangeChar {
    	# Function: This function update char $1 with char $2
    	# List of parameters:
    	#          - $1: Char to be updated
    	#          - $2: New value of the char
    	#          - $3: File to be updated
    	# ------------------------------------
    	typeset s=/
    	typeset from=$(echo "$1" | sed -e "s:${s}:\\\\${s}:g")
    	typeset to=$(  echo "$2" | sed -e "s:${s}:\\\\${s}:g")
     
    	sed "s${s}^${from}=.*${s}${to}=${s}" ${3} > ${3}.tmp
    	cp -f ${3}.tmp ${3}
    	rm -f  ${3}.tmp
    }

  6. #6
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	cp -f ${3}.tmp ${3}
    	rm -f  ${3}.tmp
    }
    heu ??? plutôt

    ou alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp -f ${3}.tmp ${3} && rm -f  ${3}.tmp
    non ?

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    Re les amis,

    Merci beaucoup de votre aide. Ça m'a été utile.

    Finalement avant de faire l'appelle a la fonction ChangeChar j'ai fait un test sur la variable "qui sera le $2" si elle est vite je lui donne 0. et dans la fonction je fait un test sur le $2 et ça marche nickel.

    Merci encore.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par azahiri Voir le message
    Finalement avant de faire l'appelle a la fonction ChangeChar j'ai fait un test sur la variable "qui sera le $2" si elle est vite je lui donne 0. et dans la fonction je fait un test sur le $2 et ça marche nickel.
    Puis-je en déduire que la variable passée à ChangeChar n'est pas entourée de guillemets?
    Si c'est le cas, j'ai bien remporté le concours de boules de cristal!

    Plutôt que de tester sa vacuité et de la remplacer par 0, as-tu essayé de l'entourer de guillemets?

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 53
    Points : 45
    Points
    45
    Par défaut
    oui j'ai essayé les guillemets j'ai même déclaré une variable au début de la fonction ChangeChar qui prend $2 comme valeur et je fais un test dessus si c'est vide ou, rien à y faire....

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 596
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ maFonc() { echo "${2:-zero}";}
    $ maFonc foo "" baz
    zero
    !

  11. #11
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Re-
    Citation Envoyé par azahiri Voir le message
    Re les amis,

    Merci beaucoup de votre aide. Ça m'a été utile.

    Finalement avant de faire l'appelle a la fonction ChangeChar j'ai fait un test sur la variable "qui sera le $2" si elle est vite je lui donne 0. et dans la fonction je fait un test sur le $2 et ça marche nickel.

    Merci encore.
    Je suis désolé mais je reste persuadé que l'erreur renvoyée par sed ne provient pas d'une variable vide ou non déclarée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/^${1}=.*/${1}=${2}/" ${3} > ${3}.tmp
    Le problème c'est que quand le 2ème argument "${2}" est une chaine vide, il me donne des messages d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 40: unknown option to `s'
    Dans le code ci-dessus, la variable $2 vide ne générera pas d'erreur, et son action se résumerait à cette syntaxe sed "s/^${1}=.*/${1}=/" ${3} > ${3}.tmp qui effacerait donc l'équivalent de .*

    La seule chose qui puisse générer cette forme d'erreur c'est, comme l'a soulignée jack-ft, la présence du séparateur par défaut dans le contenu de ta variable, mais comme tu n'a pas répondu à ma demande précédente, difficile de l'affirmer avec exactitude

    Tentative de reproduction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ A='var';B="chat"
     
    $ echo 'var=chien' | sed "s/^${A}=.*/${A}=${B}/"
    var=chat
     
    $ A='var';B=""
     
    $ echo 'var=chien' | sed "s/^${A}=.*/${A}=${B}/"
    var=
     
    $ A='var';B="/"
     
    $ echo 'var=chien' | sed "s/^${A}=.*/${A}=${B}/"
    sed: -e expression n°1, caractère 16: option inconnue pour `s'
     
    $ A='var';B="chat/"
     
    $ echo 'var=chien' | sed "s/^${A}=.*/${A}=${B}/"
    sed: -e expression n°1, caractère 20: option inconnue pour `s'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec l'utilisation de sed
    Par je®ome dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 03/02/2008, 23h44
  2. Problème avec utilitaire sed
    Par carlou135 dans le forum Linux
    Réponses: 13
    Dernier message: 22/11/2007, 19h58
  3. [Shell] problème avec sed et awk
    Par tizilfin dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 15/11/2007, 14h01
  4. Problème avec sed
    Par Zlika_ese dans le forum Linux
    Réponses: 1
    Dernier message: 26/05/2007, 22h39
  5. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo