Position de carcteres

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. merci à tous pour votre aide. Mon programme fonctionne parfaitement
    1. Modérateur
      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
      1. Modérateur
        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)?
        1. Modérateur
          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
          1. 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 ??
          2. 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
          3. Modérateur
            @dr971Salut,

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

            Non ?
        2. 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
          1. 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
          2. Modérateur
            @dr971T'as essayé la version corrigée ci-dessous ?