Position de carcteres

dr971 Messages postés 27 Statut Membre -  
dr971 Messages postés 27 Statut Membre -
Bonjour, je souhaite lire un fichier ligne par ligne et trouver la position du premier caractere de chaque ligne ( sa colonne ) en faisant une boucle pourriez vous m'aider svp. merci
Configuration: Windows XP
Internet Explorer 6.0

5 réponses

  1. pmx Messages postés 138 Statut Membre 28
     
    Je pense que le caractère "espace" ne t'interresse pas ?

    Donc si les lignes sont décalées par des espaces ou tabulations :

    cat fichier | expand | while read i
    do
    # longueur de la ligne complète
    Lfull=$(echo "$i" | wc -c)
    # longueur de la ligne sans les espaces en début de ligne
    Lshort=$(echo "$i" | sed "s/^ *//g")
    echo $(($Lfull - $Lshort))
    done

    ça devrait marcher ça non ?
    Je ne l'ai pas testé.

    A+
    pmx
    0
    1. dr971 Messages postés 27 Statut Membre
       
      merci de l'interet que tu porte à mon probleme. Mais en fait ton prog ne me donne pas la position du premier caractere de la ligne ki n'est pas un espace, il me donne la longueur de la chaine si je ne me trompe pas. Moi je voudrais la position du premier caractere qui n'est pas un espace. As tu une idéee? merci
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > dr971 Messages postés 27 Statut Membre
         
        T'as essayé la version corrigée ci-dessous ?
        0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    pmx => Pour que ton script fonctionne, il faudrait d'abord initialiser la variable "IFS" à rien(IFS=), puis compléter ta ligne :
    " Lshort=$(echo "$i" | sed "s/^ *//g")"
    avec :
    " Lshort=$(echo "$i" | sed "s/^ *//g") | wc -c".... ce qui donnerait :
    #/bin/bash
    
    OIFS=$IFS; IFS=
    cat plop | expand | while read i
    do
    # longueur de la ligne complète
    Lfull=$(echo "$i" | wc -c)
    # longueur de la ligne sans les espaces en début de ligne
    Lshort=$(echo "$i" | sed "s/^ *//g" | wc -c)
    echo $(($Lfull - $Lshort))
    done 
    IFS=$OIFS
    ;-))

    Sinon dr971 => essaie ça :
    #!/bin/bash
    
    IFS=$'\n'
    for line in $(cat plop)
    do
    pos=$(echo -e "$line" | expand | sed 's/\(^[  ]*\).*/\1/'| wc -c)
    echo -e "Position = $pos"
    done
    0
    1. pmx Messages postés 138 Statut Membre 28
       
      Ah ben oui, pourquoi faire simple ...
      jipicy a raison : il suffit de compter les espaces en début de ligne bien sûr.
      sed est vraiment très bien !
      Pourquoi les 2 espaces entre crochets dans sed ??
      0
    2. dr971 Messages postés 27 Statut Membre
       
      j'essaie d'utiliser le programme :
      #!/bin/bash

      IFS=$'\n'
      for line in $(cat plop)
      do
      pos=$(echo -e "$line" | expand | sed 's/\(^[ ]*\).*/\1/'| wc -c)
      echo -e "Position = $pos"
      done

      mais rien ne se passe pourrais tu m'indiquer la marche à suivre pour ouvrir un fichier (ex: fichier_test) et detecter la position de chaque premier caractere de chaque ligne stp . merci d'avance
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > dr971 Messages postés 27 Statut Membre
         
        Salut,

        Peut être remplacer la ligne :
        for line in $(cat plop)
        par :
        for line in $(cat fichier_test)

        Non ?
        0
      2. pmx Messages postés 138 Statut Membre 28 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        lol
        0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    la position de 1er caractère je suppose qu'est en fonctions d'un caractère de la famille espace (espace, tabulation).

    on compte la tabulation en tant qu'un caractère ou on doit la convertir en espace?
    et si on doit la convertir en espace, alors combien d'espaces pour une tabulation (si je ne me trompe pas c'est 8 par défaut)?
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Et voilà ce que ça donne

    pas d'espace
    echo "a sdjfkl" | perl -ne '/^(\s+)(?=\S)/;print length($1),"\n"'
    0

    2 espaces
    echo "  a sdjfkl" | perl -ne '/^(\s+)(?=\S)/;print length($1),"\n"'
    2

    une tabulation
    echo -e "\ta sdjfkl" | perl -ne '/^(\s+)(?=\S)/;print length($1),"\n"'
    1
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dr971 Messages postés 27 Statut Membre
     
    merci à tous pour votre aide. Mon programme fonctionne parfaitement
    0