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 :

syntaxe pour comparer des chaines lors de la lecture d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut syntaxe pour comparer des chaines lors de la lecture d'un fichier
    Bonjour à tous,

    Je suis nouveau en script shell et essaie de porter des scripts vbs en sh. Celui-ci consiste à lire un fichier et en écrire un autre selon le contenu lu.
    Je n'arrive pas à comparer deux chaines !

    Si je mets des espaces dans la comparaison (avant et après égal), il n'entre pas dans la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fichier=~/fichier.txt
    taillefichier=$(wc -l <$fichier); i=0; k=1
    while [ $i -lt $taillefichier ]; do
      i=$(($i+1))
      if [ "$(head -n $i $fichier | tail -n 1)" = "^" ]; then echo $i; fi  
    done;
    Si je ne mets pas des espaces dans la comparaison, il entre systématiquement dans la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fichier=~/fichier.txt
    taillefichier=$(wc -l <$fichier); i=0; k=1
    while [ $i -lt $taillefichier ]; do
      i=$(($i+1))
      if [ "$(head -n $i $fichier | tail -n 1)"="^" ]; then echo $i; fi  
    done;
    Je ne comprend pas pourquoi ? Merci de votre aide.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 466
    Points
    19 466
    Par défaut
    typiquement en bash (tu utilises bash ?), on fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read line
     do
       ((i++))
       echo "n° ligne est : ${i}, et ligne est :\" $line\""
    done < fichier
    ...
    ?

  3. #3
    Membre averti Avatar de exodev
    Inscrit en
    Septembre 2009
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2009
    Messages : 201
    Points : 359
    Points
    359
    Par défaut
    hello,

    Citation Envoyé par alfredaube Voir le message
    Si je ne mets pas des espaces dans la comparaison, il entre systématiquement dans la condition :
    Sans espaces ce n'est plus une comparaison

    $ if [ "un"="deux" ]; then echo "ah?"; fi
    ah?
    Sinon essaye avec =~ qui prend l'expression à droite de la comparaison comme une expression régulière

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci N_BaH pour la lecture du fichier car maintenant je ne l'ouvre qu'une fois plutôt qu'y accéder à deux reprises pour chaque ligne ! Ce n'est plus le même temps de traitement !
    Je suis bien en bash.

    Merci exodev pour ta confirmation sur la comparaison qui n'est plus sans espace. Par contre cela ne marche pas avec =~
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [: =~: binary operator expected
    J'arrive maintenant à satisfaire ma condition en ayant séparé ma ligne en deux tableaux de variables (ce qui m'intéresse dans mon cas) :

    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
    #!/bin/bash
     
    fichier=~/fichier.txt
    i=0
     
    #Lecture du fichier pour mise en tableau
    while read line
     do
       ((i++))
       prefixe[$i]=${line:0:1}
       ligne[$i]=${line:1}
    done < $fichier
     
    #Parcours du tableau
    j=0
    while [ $j -lt $i ]
     do
       ((j++))
       if [ "${prefixe[$j]}" = "^" ]
        then
          echo ${prefixe[$j]} "-" ${ligne[$j]}
      fi
    done

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 466
    Points
    19 466
    Par défaut
    pourquoi ne pas le faire en une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    fichier=~/fichier.txt
     
    while read line
     do
    #   if [ ${line:0:1} = '^' ]; then
    #      echo "${line:0:1} - ${line:1}"
    #   fi
    # ou plus court :
        [ ${line:0:1} = '^' ] && echo "${line:0:1} - ${line:1}"
    done < $fichier
    ?

    sinon, il faut des crochets doubles, pour évaluer des regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ $line =~ ^'^' ]] && echo "${line:0:1} - ${line:1}"
    et on arrive au même résultat avec sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -nr '/^\^/s/.{1}/& - /p' fichier.txt

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

Discussions similaires

  1. [XL-2003] Pb pour comparer des chaines dans une fonction
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/09/2011, 19h53
  2. Réponses: 1
    Dernier message: 10/09/2006, 16h09
  3. Problème de syntaxe pour concaténer des variables
    Par renaud26 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/09/2006, 09h44
  4. Outil pour comparer des bases SQL Server 2000
    Par plutonium719 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/08/2006, 07h54
  5. [Tableaux] Syntaxe pour transmettre des variables
    Par kilkikou dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2006, 10h26

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