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

Linux Discussion :

[commande sed] substitution de caractères


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de matrix788
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 740
    Billets dans le blog
    2
    Par défaut [commande sed] substitution de caractères
    Bonsoir,

    voilà j'ai un petit problème sur un script que j'aimerais bien résoudre, mais apparemment la solution m'échappe...

    Je cherche à substituer la chaîne de caractère particulière : \xe8\x5c\x31\xf9\xff par celle-là : \x90\x90\x90\x90\x90

    mais mon fichier reste tel quel, malgré que je n'ai pas d'erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #!/bin/sh
     
    toto="\xe8\x5c\x31\xf9\xff"
    dada="/home/tux/test.txt"
    for x in $toto;do
    echo $x
    sed -i 's/$x/\x90\x90\x90\x90\x90/g' $dada
    done
    le contenu de test.txt contient seulement la ligne : \xe8\x5c\x31\xf9\xff

    le résultat de sed me renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./toto.sh
    found \xe8\x5c\x31\xf9\xff

    si je fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed -e  's/$x/\x90\x90\x90\x90\x90/g' $dada
    j'ai en retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ ./toto.sh
    found \xe8\x5c\x31\xf9\xff
    \xe8\x5c\x31\xf9\xff
    donc le fichier reste inchangé. Une aide serait la bienvenue. Merci par avance.

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    je ne comprends pas très bien l'utilité de ton "for"
    Sinon peut-être que cette commande te donnera de meilleurs résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed -e  "s/$x/w \x90\x90\x90\x90\x90/g" $dada

  3. #3
    Membre émérite
    Avatar de matrix788
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 740
    Billets dans le blog
    2
    Par défaut
    oublies la commande for pour le moment, ce qui m'intéresse c'est l'erreur de sed, et comprendre comment se fait-il qu'il n'arrive pas à substituer la chaîne...

    merci pour ta réponse, mais j'ai toujours une erreur après ton exemple :

    sed: -e expression n°1, caractère 46: Référence arrière invalide

  4. #4
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Bonjour,

    Citation Envoyé par matrix788
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/$x/\x90\x90\x90\x90\x90/g' $dada
    Citation Envoyé par quetzacoatl
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e  "s/$x/w \x90\x90\x90\x90\x90/g" $dada
    Citation Envoyé par matrix788
    […] ce qui m'intéresse c'est l'erreur de sed, et comprendre comment se fait-il qu'il n'arrive pas à substituer la chaîne...
    Parce que c’est le shell, et non sed qui s’occupe de remplacer le $x par le contenu de la variable x, et dans ta commande, il est entre '…', ce qui désactive le remplacement, donc sed voit la chaîne littérale '$x', ne la trouve pas, et ne fait donc pas de substitution (ce qui n’est pas une erreur).

    Les "…" de la commande de quetzacoatl ne désactivent pas le remplacement, donc sed cherche bien la chaîne que tu veux qu’il cherche (et la trouve)

    L’erreur que tu as alors est due aux références arrière dans ta chaîne de remplacement (type '\1', '\«un nombre hexadécimal»' dans ton cas).
    Je ne sais pas comment échapper cela (doubler le '\' ne marche pas, pas d’info sur la page man de sed), j’ai jamais eu affaire à ce problème, il faudra qu’un spécialiste de sed passe par là pour t’aider plus.

  5. #5
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Re,

    Après essais, il s’avère que le problème vient des '\' dans la chaîne recherchée, il faut les doubler également.
    Une solution :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "s/$(echo $toto | sed 's/\\/\\\\/g')/\\\\x90\x90\x90\x90\x90/g" test.txt
    Problème : ça marche avec la notation $(…), mais pas avec la notation `…`, or sur sh, il n’y a que la notation `…` (tu sembles utiliser sh).

  6. #6
    Membre émérite
    Avatar de matrix788
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 740
    Billets dans le blog
    2
    Par défaut
    pas mieux, voici les caractères qui sont insérés :

    \\x90����

Discussions similaires

  1. Sed - substitution de caractères fichier csv
    Par airfox35 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 23/01/2014, 15h15
  2. Réponses: 3
    Dernier message: 24/04/2009, 09h12
  3. Commande SED
    Par pierregag dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 17/03/2006, 12h51
  4. Réponses: 9
    Dernier message: 30/06/2004, 23h19
  5. Substitution de caractères quand on enfonce une touche
    Par Dionyzos dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/06/2004, 13h37

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