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 :

Manipulation de chaine


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut Manipulation de chaine
    Bonjour,
    Je débute en bash, et j'aimerais remplacer des occurrences dans une chaine, et les mettre au format voulu... Mais voilà, je n'y arrive pas.

    En bref, j'ai une chaine de caractère qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LOT 123 A
    €      12.3456
    et j'aimerais obtenir 2 variables formatées ainsi :
    J'ai essayé plusieurs choses, mais à vrai dire rien de structuré ou présentable

    Par avance merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    j'aimerais obtenir 2 variables formatées ainsi
    pourquoi ?
    quelle est la "logique" d'une telle transformation ?
    d'où vient cette chaîne ? comment est-elle "fournie" au script ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut
    Bonjour N_Bah,

    Voici mes réponses à tes questions :
    pourquoi ?
    1/ Pour qu'au moins la 1ere variable soit exploitable par la suite dans le script (vérification d'existance de fichier à partir de celle ci)
    2/ Pour savoir le faire ensuite et ne plus reposer la question

    quelle est la "logique" d'une telle transformation ?
    Elle m'est nécessaire pour rechercher un fichier à partir de celle ci

    d'où vient cette chaîne ? comment est-elle "fournie" au script ?
    Elle est issue d'une reconnaissance OCR. Je peux éventuellement supprimer la chaine "LOT" du l'exemple fournit, mais il me faut un resultat sans espace et sans point...

    Bien à toi

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    tu n'as pas compris mes questions, je ne cherche pas les justifications pour effectuer cette transformation, mais les critères de celle-ci : c'est-à-dire quels éléments doivent disparaître, pourquoi (leur emplacement, leur valeur...?)

    donc, "LOT" ne doit pas apparaître dans le résultat, mais, apparemment, "€" non plus !? pourquoi ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut
    Ok,

    L'exemple que je fourni dans le 1er post est emblématique de la transformation.

    J'obtiens toujours une chaine composée comme suit :
    1/ Le mot LOT suivi d'une serie de 1 à 3 chiffres et d'éventuellement d'une lettre à la suite.
    Très souvent un retour à la ligne
    2/ Un symbole de monnaie (€, $) suivi d'une série d'espace et d'une série de chiffre dont les milliers sont parfois séparé par un point (.)

    Cette ensemble de caractères doit être transformé en 2 sous ensembles afin d'être exploitable :
    1/ Une serie de 1 à 3 chiffres sous forme de nombre, ayant eventuellement une lettre accolé
    2/ Une serie de chiffre sous forme de nombre uniquement pour la seconde

    J'espere avoir été plus clair ?

    PS : je le faisais précedement en php, ce qui ne convient plus, et cela ressemblait à cela :
    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
    20
    21
    22
    23
    if ( $r *1 >= 0 ) return preg_replace('/\./', '', $r);
    $r = preg_split('/[\n\r]/', $r);
    $res = array();
      foreach ($r as $key => $value) {
        if ( trim($value) !== '' ){
          array_push($res, $value);
        }
      }
      foreach ($res as $key => $value) {
        $lot = preg_match("/(#|lot|Lot|LOT|LQT)(\s|\s+)?([0-9]{1,3}[a-zA-Z]{0,1})/", $value, $l);
        if ($lot == 1) break;
      }
      $eu = -1;
      foreach ($res as $key => $value) {
        $euro = preg_match("/(€|EUR|EURO)(\s|\s+)?([0-9\.]+)/", $value, $e);
        if ($euro == 1) {
          $eu = preg_replace('/\./', '', $e[count($e)-1]);
          if  ( trim($eu)== "" || is_bool($eu) ) $eu = -1;
          break;
        }
      }
      ...
    }
    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    la sortie de la commande OCR ne comporte qu'une ou deux lignes ?
    si il n'y a qu'une ligne, le "prix" est-il toujours présent ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut
    une ou deux lignes ?
    ...
    le "prix" est-il toujours présent ?
    Cela dépend... Parfois il n'y a qu'une ligne, parfois 2, parfois avec un prix, parfois sans...

    C'est variable...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    ouais c'est la fête quoi

    a priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cmdOCR | while read -r line
    do
       : des tests sur la valeur en début de ligne, peut-être.
       IFS=' .' read -r a b c
       echo "$b$c"
    done
    c'est très sommaire, il faudra affiner.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut
    ouais c'est la fête quoi
    Eh Oui...

    C'est tout ?? Je m'attendais à un gros pavé

    Bon, je m'en vais décortiquer cela

    Merci N_BaH

  10. #10
    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,

    Citation Envoyé par N_BaH Voir le message
    ouais c'est la fête quoi

    a priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cmdOCR | while read -r line
    do
       : des tests sur la valeur en début de ligne, peut-être.
       IFS=' .' read -r a b c
       echo "$b$c"
    done
    c'est très sommaire, il faudra affiner.
    Je ne comprends pas tout, 2 read et on tu n'en exploites qu'un seul ???
    Cordialement.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut
    Bon, je reviens car ca ne va pas...

    Je pense qu'il me faut procéder autrement...

    peux t on utiliser les expression rationnel pour le remplacement ou la detection à l'image de ce que font preg_replace et preg_match ?

  12. #12
    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
    Oui,a l'origine, les regex php sont les mêmes que perl mais si tu n'as que ça à faire, la commande sed devrait être suffisante.
    Cordialement.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut
    Ok,

    Je n'ai que cela à faire effectivement, je vais donc voir du cote de sed.

    Peux tu me montrer la syntaxe pour mon exemple afin que je puisse l'appliquer au reste de mon script par la suite ?

    Par exemple extraire 123A de la chaine "LOT 123 A" ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    'oublié des trucs
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cmdOCR | while read -r line
    do
       : des tests sur la valeur en début de ligne, peut-être.
       IFS=' .' read -r a b c <<< "$line" # à cause des tests éventuels, mais on pourrait aussi le mettre immédiatement après le while (à la place du premier read)
       echo "$b$c"
    done

    bash sait aussi gérer des regex avec l'opérateur =~ entre double crochets ([[ $string =~ $regex ]]) et le tableau BASH_REMATCH
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    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
    La commande sed pour l'exemple complet en prenant en compte tes regex_match, mais je ne comprends pas le '#' dans la partie "lot" et le premier "?" (que j'ai remplacer par le symbole '€' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmdOCR | sed -r 's/(#|lot|Lot|LOT|LQT)(\s|\s+)?([0-9]{1,3}[a-zA-Z]{0,1}) /\3/;s/(€|EUR|EURO)(\s|\s+)?([0-9\.]+)/\3/;s/\.//g'
    ici, il y a 3 commande sed:
    s/(#|lot|Lot|LOT|LQT)(\s|\s+)?([0-9]{1,3}[a-zA-Z]{0,1}) /\3/
    s/(€|EUR|EURO)(\s|\s+)?([0-9\.]+)/\3/
    s/\.//g
    L'option '-r' est spécifique gnu sed qui permet d'avoir une syntaxe proche du moteur de regex perl.

    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo -e "LOT 123 A\n\t   123.456" | sed -r 's/(#|lot|Lot|LOT|LQT)(\s|\s+)?([0-9]{1,3}[a-zA-Z]{0,1}) /\3/;s/(€|EUR|EURO)(\s|\s+)?([0-9\.]+)/\3/;s/\.//g'
    123A
    123456
    Cordialement.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 201
    Points : 150
    Points
    150
    Par défaut

    Cool !!

    Merci à vous 2, avec ceci, je vais avoir de quoi faire.

    Je bosse tout ça et reviens si besoin. Encore merci.

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ]$ echo -e "LOT 123 A\n\t   123.456" | sed ':z;s/^[^0-9]\|[^0-9A-Z]//g;tz'
    123A
    123456
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    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
    Oui, il est vrai qu'il y avait plus simple en regex mais j'ai volontairement essayé de conserver celle de son php pour la compréhension, sinon en plus court:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo -e "LOT 123 A\n\t   123.456" | sed 's/^[^0-9]*\|[\t .]//g'
    123A
    123456
    Cordialement.

  19. #19
    Membre du Club
    Homme Profil pro
    Administrateur Systèmes et Réseaux
    Inscrit en
    Janvier 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur Systèmes et Réseaux

    Informations forums :
    Inscription : Janvier 2012
    Messages : 41
    Points : 54
    Points
    54
    Par défaut
    Salut,

    Si cela peut t'aider, dans le cas où tes chaînes sont bien identifiées, voici un morceau de code que tu peux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #NR%2 = modulo 2 soit une ligne sur deux
    cat log | awk -F" " 'NR%2==0{print $2} NR%2==1{print $2$3}'
    dans le cas où le fichier se présente ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    LOT 123 A ezaeae
    €	   123.456 aeeaze
    LOT 123 A ee
    €	   123.456 aeaze
    LOT 123 A geg
    €	   123.456 aeaez
    LOT 123 A fezf
    €	   123.456 aazeae

Discussions similaires

  1. Manipulation de chaines
    Par tchoukapi dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 04/09/2006, 17h41
  2. [D7] Manipulations de chaines
    Par jer64 dans le forum Delphi
    Réponses: 2
    Dernier message: 21/07/2006, 22h16
  3. [PLSQL] Manipulation des chaines.
    Par zero d dans le forum Oracle
    Réponses: 5
    Dernier message: 14/12/2005, 18h27
  4. Réponses: 4
    Dernier message: 20/08/2004, 10h59
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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