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 :

sed et caractères très spéciaux


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Par défaut sed et caractères très spéciaux
    Bonjour à tous,

    J'ai un souci avec la commande SED...

    Mon fichier test2 contient cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temp_numplan_file=G\:/s22/test.csv
    Mon fichier test que j’exécute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    num=`awk -F= '/^temp_numplan_file=/{print $2}' "./test2"`
    sed -i -e 's,'$num',/test,g' ./test2
    Si je fais un echo de $num le résultat est bien G\:/s22/test.csv par contre impossible de modifier la valeur de temp_numplan_file.
    Par contre si temp_numplan_file=/s22/test.csv dans le fichier test2 la valeur est bien modifier.
    Donc le soucis provient de G\:

    Il doit y avoir une astuce avec des guillemet ou quotes mais je n'ai pas trouvé.

    Merci de votre aide.

  2. #2
    Expert confirmé

    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
    Par défaut
    Salut,

    Effectivement, il faut protéger l'anti-slash de ta variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat plop 
    blabla
    G\:/s22/test.csv
    blabla
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${A}
    G\:/s22/test.csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo ${A//\\/\\\\}
    G\\:/s22/test.csv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed 's,'${A//\\/\\\\}',test,' plop 
    blabla
    test
    blabla

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Par défaut
    Génial merci beaucoup


  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Pourquoi ne fais-tu pas simplement un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ie 's/^\(temp_numplan_file=\).*/\1test/' test2

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Bonjour,
    Citation Envoyé par matafan Voir le message
    Pourquoi ne fais-tu pas simplement un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ie 's/^\(temp_numplan_file=\).*/\1test/' test2
    Ceci fonctionnerait, si son fichier ne contient effectivement que ce type de ligne.
    Sont passage par awk, lui permet de récupérer le champs 2 (donc entre le premier et deuxième "=")
    ensuite sont sed, modifie toutes les pattern qui corresponde à ce champs 2 par "test".

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ok je n'avais pas compris que le pattern apparaissait aussi ailleurs dans le fichier.

    sed n'est vraiment pas l'outil le plus adapté pour cela. Si le pattern que ton awk extrait contient des caractères qui ont un sens particulier dans une regexp (et d'ailleurs c'est le cas ici avec le point de ".csv"), il faudrait les échapper. Tu peux avoir quelque chose qui marchotte, mais pour avoir quelque chose de robuste c'est extrêmement compliqué.

  7. #7
    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
    Par défaut
    Y a-t-il une option de sed ou de la commande "s" de sed qui indique qu'il s'agit d'une substitution fixe et non d'une expression régulière?
    (un peu comme fgrep par opposition à egrep)

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Non, sous sed, il n'y en a pas, par contre tu peux utiliser perl avec le connecteur \Q à la place de sed:
    Ici, on veut modifier .* par toto du fichier "fits"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat fits 
    .*$^ABCabt*\+*.*
    $ perl -p -e 's/\Q.*/toto/g' fits 
    toto$^ABCabt*\+*toto
    Le seul piège est le "\" qui doit être protégé s'il est en position finale du pattern (ce qui est logique car par exemple si on veut ici que le "/" fasse partie du pattern, il faut bien que perl s'y retrouve )

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

Discussions similaires

  1. Caractère spéciaux très spéciaux
    Par lejimi dans le forum Débuter
    Réponses: 2
    Dernier message: 13/06/2015, 12h44
  2. [Encodage] simpleXML : caractères trés spéciaux
    Par drakk dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2013, 09h28
  3. Caractères très spéciaux avec utf8_decode
    Par Flob59 dans le forum Langage
    Réponses: 1
    Dernier message: 09/06/2010, 16h33
  4. ksh sed et caractères spéciaux
    Par floanne dans le forum Linux
    Réponses: 6
    Dernier message: 23/06/2009, 13h43
  5. Caractères très spéciaux
    Par tioneb369 dans le forum Mise en forme
    Réponses: 3
    Dernier message: 07/06/2007, 12h24

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