Position de carcteres

dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -  
dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -
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
A voir également:

5 réponses

pmx Messages postés 138 Date d'inscription   Statut Membre Dernière intervention   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
dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
T'as essayé la version corrigée ci-dessous ?
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
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
pmx Messages postés 138 Date d'inscription   Statut Membre Dernière intervention   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
dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
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
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896 > dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,

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

Non ?
0
pmx Messages postés 138 Date d'inscription   Statut Membre Dernière intervention   28 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
 
lol
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dr971 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention  
 
merci à tous pour votre aide. Mon programme fonctionne parfaitement
0