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 :

Echappement de caractères sur chaque ligne d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé Avatar de Aizen64
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 561
    Points : 462
    Points
    462
    Par défaut Echappement de caractères sur chaque ligne d'un fichier
    Bonjour,

    j'aimerai, pour chaque ligne d'un fichier texte qui contient des chemins vers des fichiers, ajouter devant chaque espace ou parenthèse l'antislash d’échappement de caractères.

    sed doit pouvoir faire le travail mais je trouve que le manuel est assez déroutant pour le coup.
    Exprimer une différence d'opinion vaut mieux que :

  2. #2
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Les espaces dans un nom de fichier, c'est pas bien.
    Les parenthèses, pour le coup c'est original. J'ai jamais vu mais c'est pas bien non plus.

    Vite fait, sur le gaz, je te propose quelques pistes.
    Je veux remplacer tous les caractères espace (' ') par le doublon anti slash espace ('\ ') :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public$ ls -al
    total 8
    drwxr-xr-x  2 raph raph 4096 Feb  7 15:27 .
    drwxr-xr-x 38 raph raph 4096 Jun 28 10:17 ..
    Public$ ls -al | sed -e 's/ /\\ /g'
    total\ 8
    drwxr-xr-x\ \ 2\ raph\ raph\ 4096\ Feb\ \ 7\ 15:27\ .
    drwxr-xr-x\ 38\ raph\ raph\ 4096\ Jun\ 28\ 10:17\ ..
    Public$
    Pour faire la même chose avec les parenthèses, je me demande si sed est capable de faire plusieurs substitution à la fois.
    Dans le doute, j'enchaînerais plusieurs sed à la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat fichieravecespaceparenthese.txt | sed -e 's/ /\\ /g' | sed -e 's/\(/\\\(/g' | sed -e 's/\)/\\\)/g'
    Ouf !
    J'ai pas testé. je t'en laisse le soin.
    Quelques explications sur sed (attention, je ne suis pas vraiment un guru) avec un exemple simple :
    Dans fichier.txt, je veux substituer la chaîne de caractères "abc" par la chaîne "ABCD"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed -e 's/abc/ABCD/g' fichier.txt
    Le s veut dire substitution, le g veut dire global cad pas uniquement sur la 1ère occurrence de "abc" mais sur l'ensemble de la ligne où il pourrait y avoir plusieurs fois "abc".
    Evidemment dans notre cas ça se complique un peu car nous traitons des caractères un peu particulier (espace et parenthèses) qu'il faut banaliser avec un anti-slash.
    IMHO, you should RTFM ASAP. IHTH.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Bonjour,

    Quel est vraiment ton besoin final ?
    Car je pense que tu fais une mauvaise utilisation de variable pour traiter un nom de fichier avec des espaces et/ou des parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ XX="bob va a la (plage)"
    $ ls -l $XX
    ls: cannot access va: No such file or directory
    ls: cannot access a: No such file or directory
    ls: cannot access la: No such file or directory
    ls: cannot access (plage): No such file or directory
    ls: cannot access bob: No such file or directory 
    $ ls -l "$XX"
    -rw-r--r-- 1 xxx xxxx xxxx 0 Jun 28 12:15 bob va a la (plage)
    Sinon, le sed demandé est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\([ ()]\)/\\\1/g' fichier
    Mais pour moi, c'est la solution crade de passer par un sed si c'est juste pour géré une chaine dans une variable...
    Cordialement.

  4. #4
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut Auto correction
    Je m'auto corrige car j'ai écrit des bétises.

    Citation Envoyé par RaphaelG Voir le message
    ...
    Pour faire la même chose avec les parenthèses, je me demande si sed est capable de faire plusieurs substitution à la fois.
    Dans le doute, j'enchaînerais plusieurs sed à la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat fichieravecespaceparenthese.txt | sed -e 's/ /\\ /g' | sed -e 's/\(/\\\(/g' | sed -e 's/\)/\\\)/g'
    Ca marche pas. les parenthèses n'ont pas besoin d'être banalisées par un anti slash.
    Et puis j'ai trouvé comment ne pas avoir à piper plusieurs sed.
    En reprenant l'exemple de disedorgue, cela donne maintenant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public$ touch "bob va a la (plage)"
    Public$ ls
    bob va a la (plage)
    Public$ ls | sed -e 's/ /\\ /g' -e 's/(/\\(/g' -e 's/)/\\)/g'
    bob\ va\ a\ la\ \(plage\)
    Public$
    Ceci corrigé, je dois reconnaître que la solution de disedorgue est plus élégante et plus compacte.
    IMHO, you should RTFM ASAP. IHTH.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    pour la petite info l'option -Q de ls permet d'afficher les noms de fichiers entre guillemets "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ ls -Q | while read i; do echo $i; done
    "bob va à la (plage)"
    "pouet"
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ XX="bob va a la (plage)"
    excellente idée

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Aizen64 Voir le message
    j'aimerai, pour chaque ligne d'un fichier texte qui contient des chemins vers des fichiers, ajouter devant chaque espace ou parenthèse l'antislash d’échappement de caractères.
    Je plussoie disedorgue: pourquoi veux-tu faire cela?

Discussions similaires

  1. Suppression lignes et caractères sur chaque ligne
    Par YLKweb dans le forum VBScript
    Réponses: 59
    Dernier message: 07/07/2015, 09h02
  2. Réponses: 6
    Dernier message: 18/10/2009, 08h28
  3. Réponses: 15
    Dernier message: 28/02/2007, 10h00
  4. Réponses: 22
    Dernier message: 10/02/2007, 12h02
  5. Réponses: 13
    Dernier message: 20/11/2006, 17h46

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