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. 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 ?
  2. 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 ?
  3. 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
      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. merci à tous pour votre aide. Mon programme fonctionne parfaitement