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 :

Remplacer un path par nom de fichier : sed


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut Remplacer un path par nom de fichier : sed
    Bonjour,
    J'ai un fichier de ce type
    OBX|1|TX|G~TESTS~L||RENSEIGNEMENTS CLINIQUES~~<test>~~~~EXAMEN MACROSCOPIQUE~~~~~~EXAMEN MICROSCOPIQUE~~~~~~CONCLUSION~~~~test~~Signé électroniquement le 01/09/2016 07:34 par ~~~~||||||F||
    A||20160901073411||123456789531453135~test&test&&&&&~A~~~A~&&&&&France&&&|
    OBX|2|FIC|G~XX XX~L||\\toto\d$\XX\yyy\P16000023.pdf||||||F|||20160901073411||123456789531453135~test&test&&&&&~A~~~A~&&&&&France&&&|
    L|1||1|8
    et je voudrais remplacer la chaine \\toto\d$\XX\yyy\P16000023.pdf par P16000023.pdf.

    J'ai essayé toute sorte de combinaison de sed et de awk mais sans succès : dernière en date ci-dessous.
    Extraction du path, extraction du chemin et remplacement de l'un avec l'autre mais cela n'a aucun effet sur mon fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       awk  -F '|' '{ if ($3=="FIC")  print $5 }' $fic  > path.txt
       cat   path.txt > $CHEMIN
       sed -e 's/.*\\//' path.txt > $FILE
       sed  "s£'$CHEMIN'£'$FILE'£" $fic > resultat.txt
    Les variables CHEMIN et FILE contiennent bien le chemin absolu et le nom du fichier.

    Une idée?
    Merci.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    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 358
    Par défaut
    Bonjour,

    Le sed suivant devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\\\\.*\\//' fichier

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Bonjour,

    Merci beaucoup, ça fonctionne parfaitement.
    Est-ce que je peux avoir une explication de texte?

    Merci.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    J'aurais une autre question toujours en lien avec sed :
    avec l'action précédente, j'obtiens bien
    OBX|2|FIC|G~XX XX~L||P16000023.pdf|
    Par contre, il faudrait ensuite que j'ajoute une valeur devant est derrière en séparant pas des tildas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TOTO="toto~"$FILE"~toto"
    sed 's/'"${FILE}"'/'"${TOTO}"'/'  fichier
    J'ai erreur suivante : La première expression régulière ne doit pas être vide
    J'ai vu qu'avec des variables dans sed, il fallait utiliser l'option -i mais elle neest pas disponible sur mon OS.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    on peut faire tout le boulot dans awk, en admettant qu'il est question de repérer les lignes avec "FIC" et seulement celles-là, basé sur les données fournies en exemple :
    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
    awk -F'|' '
    $3 != "FIC" {                      # si la ligne ne contient pas "FIC"
       print;                          # on l affiche telle quel
       next;                           # et on passe à la ligne suivante
    }
     
    {                                  # dans le cas contraire (la ligne contient "FIC")
       gsub(/^.+\\/, "", $6);          # on ne garde que le nom de fichier
       $6 = "TOTO~" $6 "~TOTO";        # on rajoute les délimiteurs de part et d autre
     
       for (i = 1; i < NF; i++)        # et on affiche le tout, mais comme le séparateur était "|"
          printf ("%s|", $(i));        # il faut réassembler (join) toutes les parties explicitement
       printf("%s\n", $NF);
    }
    ' fichier
    évidemment on peut tout mettre sur une ligne unique en sacrifiant un peu de lisibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk  -F'|' '$3!="FIC"{print;next}{gsub(/^.+\\/,"",$6);$6="TOTO~"$6"~TOTO";for(i=1;i<NF;i++)printf("%s|",$(i));printf("%s\n",$NF)}' fichier
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    OBX|1|TX|G~TESTS~L||RENSEIGNEMENTS CLINIQUES~~<test>~~~~EXAMEN MACROSCOPIQUE~~~~~~EXAMEN MICROSCOPIQUE~~~~~~CONCLUSION~~~~test~~Signé électroniquement le 01/09/2016 07:34 par ~~~~||||||F||
    A||20160901073411||123456789531453135~test&test&&&&&~A~~~A~&&&&&France&&&|
    OBX|2|FIC|G~XX XX~L||TOTO~P16000023.pdf~TOTO||||||F|||20160901073411||123456789531453135~test&test&&&&&~A~~~A~&&&&&France&&&|
    L|1||1|8

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Super!
    Merci beaucoup.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par Michalak Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TOTO="toto~"$FILE"~toto"
    sed 's/'"${FILE}"'/'"${TOTO}"'/'  fichier
    Petite remarque de style: c'est un peu dur à lire, ton truc, avec les mélanges de simples et doubles quotes

    À la première ligne, il vaut mieux entourer la variables d'accolades (comme tu as bien fait à la 2ème ligne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TOTO="toto~${FILE}~toto"
    Pour la 2ème ligne, tu peux utiliser des guillemets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/${FILE}/${TOTO}/" fichier

    J'ai erreur suivante : La première expression régulière ne doit pas être vide.
    C'est probablement dû au fait que la variable "FILE" n'est pas valuée.

    Tu peux le vérifier en mettant, avant la 1ère ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "FILE contient: '${FILE}' et sa longueur est ${#FILE}"
    J'ai vu qu'avec des variables dans sed, il fallait utiliser l'option -i mais elle neest pas disponible sur mon OS.
    Tu n'as pas besoin de ça ici. Tu peux juste utiliser les variables du shell.

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

Discussions similaires

  1. Trier fichier par nom de fichier
    Par pierrot2908 dans le forum VBScript
    Réponses: 1
    Dernier message: 19/09/2013, 16h28
  2. JFileChooser sans JFrame - Receuillir les path et nom du fichier sélectionné
    Par Chavadam dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 14/08/2013, 12h12
  3. tri par nom de fichier et boucle
    Par mederik dans le forum Shell et commandes POSIX
    Réponses: 7
    Dernier message: 19/12/2011, 11h36
  4. Email en MAPI, remplacer lien FILE:// par nom significatif
    Par DEMMAR dans le forum ODS et reporting
    Réponses: 6
    Dernier message: 12/07/2011, 17h15
  5. Recuperer path sans nom du fichier
    Par Happy dans le forum C++
    Réponses: 8
    Dernier message: 01/12/2006, 11h55

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