Position de carcteres

Fermé
dr971 Messages postés 27 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007 - 6 mars 2007 à 20:03
dr971 Messages postés 27 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007 - 8 mars 2007 à 18:01
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

5 réponses

pmx Messages postés 138 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 14 mars 2008 28
6 mars 2007 à 20:55
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 mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007
6 mars 2007 à 22:42
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 40805 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 901 > dr971 Messages postés 27 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007
6 mars 2007 à 23:04
T'as essayé la version corrigée ci-dessous ?
0
jipicy Messages postés 40805 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 901
6 mars 2007 à 22:42
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 vendredi 15 avril 2005 Statut Membre Dernière intervention 14 mars 2008 28
7 mars 2007 à 00:22
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 mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007
7 mars 2007 à 18:14
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 40805 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 901 > dr971 Messages postés 27 Date d'inscription mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007
7 mars 2007 à 18:18
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 vendredi 15 avril 2005 Statut Membre Dernière intervention 14 mars 2008 28 > jipicy Messages postés 40805 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
7 mars 2007 à 18:30
lol
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 mars 2007 à 07:16
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
7 mars 2007 à 09:10
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 mardi 6 mars 2007 Statut Membre Dernière intervention 26 juillet 2007
8 mars 2007 à 18:01
merci à tous pour votre aide. Mon programme fonctionne parfaitement
0