Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/04/2020, à 05:08

ar barzh paour

[Résolu] printf serait-il buggé comme cut ?

voir post 3 et 4 print compte les bytes
mauvais alignement ? ou je ne vois pas clair ?

for f in cl*.txt; do     printf "fichier : %-15s    chgt : %s modif : %s\n" $(basename "$f") $(stat -c %z "$f" |cut -d ' ' -f1 ) $(stat -c %y "$f" |cut -d ' ' -f1 ); done
fichier : cle.txt            chgt : 2020-04-02 modif : 2020-04-02
fichier : clé.txt           chgt : 2020-04-02 modif : 2020-04-02

Dernière modification par ar barzh paour (Le 02/04/2020, à 15:34)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

Hors ligne

#2 Le 02/04/2020, à 09:28

diesel

Re : [Résolu] printf serait-il buggé comme cut ?

Je pense que la différence vient des "stat" et "cut".

Essaye la même chose en enlevant les "cut" et je pense que tu y trouveras l'espace en trop ou en moins.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#3 Le 02/04/2020, à 10:13

credenhill

Re : [Résolu] printf serait-il buggé comme cut ?

hello
poblème avec les caractères accentués dans le noms, peut-être

Hors ligne

#4 Le 02/04/2020, à 11:09

pingouinux

Re : [Résolu] printf serait-il buggé comme cut ?

Bonjour,
Je penche aussi pour l'explication de credenhill en #3.
C'est printf qui est en cause. Il ne compte pas le nombre de caractères, mais le nombre de bytes.

e => <U0065>     /x65         LATIN SMALL LETTER E
é => <U00E9>     /xc3/xa9     LATIN SMALL LETTER E WITH ACUTE
█ => <U2588>     /xe2/x96/x88 FULL BLOCK

Voici un petit test

$ mon_print() { printf "=%-4s=\n" "$1";}

$ mon_print e
=e   =

$ mon_print é
=é  =

$ mon_print █
=█ =

Hors ligne

#5 Le 02/04/2020, à 15:19

ar barzh paour

Re : [Résolu] printf serait-il buggé comme cut ?

@diesel ,non cut n'est pas en cause ici
j'ai recopier une formule que j'ai utilisée mais qui peut se simplifier , sans utiliser cut et l'on voit la même décalage

for f in cl*.txt; do     printf "fichier : %-15s    chgt : \n" $(basename "$f") ; done
fichier : cle.txt            chgt : 
fichier : clé.txt           chgt : 

(c'est pourquoi j'avais indiqué "buggé comme cut)

mon_print() { printf "=%-4s=\n" "$1";}
for car in  e é █ ; do mon_print "$car" ; done
=e   =
=é  =
=█ =

Dernière modification par ar barzh paour (Le 02/04/2020, à 15:33)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

Hors ligne

#6 Le 02/04/2020, à 15:36

pingouinux

Re : [Résolu] printf serait-il buggé comme cut ?

Je viens de vérifier pour cut, il compte aussi les bytes.

info cut a écrit :

‘-b BYTE-LIST’
‘--bytes=BYTE-LIST’
     Select for printing only the bytes in positions listed in
     BYTE-LIST.  Tabs and backspaces are treated like any other
     character; they take up 1 byte.  If an output delimiter is
     specified, (see the description of ‘--output-delimiter’), then
     output that string between ranges of selected bytes.

‘-c CHARACTER-LIST’
‘--characters=CHARACTER-LIST’
     Select for printing only the characters in positions listed in
     CHARACTER-LIST.  The same as ‘-b’ for now, but internationalization
     will change that
.  Tabs and backspaces are treated like any other
     character; they take up 1 character.  If an output delimiter is
     specified, (see the description of ‘--output-delimiter’), then
     output that string between ranges of selected bytes.

Hors ligne

#7 Le 03/04/2020, à 08:39

bruno

Re : [Résolu] printf serait-il buggé comme cut ?

Bonjour,

Le problème est marqué comme résolu mais je ne vois pas la solution wink
Si je reprend l'exemple du #5 :

$ for car in e é €; do printf "%-4s=\n"  "$car"; done
e   =
é  =
€ =

Maintenant si on veut avoir des espacement constants, il faut le faire avec une chaîne qui est constante (par exemple une chaîne vide) :

$ for car in e é €; do printf "%s%-4s=\n"  "$car"; done
e    =
é    =
€    =

Hors ligne

#8 Le 03/04/2020, à 14:01

ar barzh paour

Re : [Résolu] printf serait-il buggé comme cut ?

@bruno
merci , j'ai marqué résolu parce que je pensais qu'il n'y avait pas de solution

bruno a écrit :

Maintenant si on veut avoir des espacement constants, il faut le faire avec une chaîne qui est constante (par exemple une chaîne vide) :

oui effectivement ça marche mais je ne comprends pas la solution , il suffirait ? de mettre espace derrière %s

for car in e é €; do printf "%s fin\n"  "$car"; done
e fin
é fin
€ fin

ce qui contredit mon exemple du post #1

for f in cl*.txt; do printf "%-15s chgt\n" "$f"; done
cle.txt         chgt
clé.txt        chgt

mais en mettant une chaine "vide" c'est OK !

for f in cl*.txt; do printf "%s%-15s chgt\n" $f; done
cle.txt                chgt
clé.txt                chgt

quelle est la longueur obtenue ?

for f in cl*.txt; do ( printf "%-15s chgt\n" "$f" ; var=$(printf "%-15s chgt\n" "$f")  ; echo ${#var} );done
cle.txt         chgt
20
clé.txt        chgt
19
for f in cl*.txt; do ( printf "%s%-15s chgt\n" "$f" ; var=$(printf "%s%-15s chgt\n" "$f")  ; echo ${#var} ) ; done
cle.txt                chgt
27
clé.txt                chgt
27

Dernière modification par ar barzh paour (Le 03/04/2020, à 14:21)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

Hors ligne

#9 Le 03/04/2020, à 14:14

bruno

Re : [Résolu] printf serait-il buggé comme cut ?

Dans mon premier retour en #7 la valeur de $car est substituée par %-4s. Donc printf devrait utiliser 4 caractères pour afficher la chaîne contenue dans $car. Si cette chaîne fait moins de 4 caractères, des espaces sont ajoutés.
En fait printf utilise des octets et non des caractères :
    e est codé sur un octet : 0x65, on obtient donc e suivi de trois espaces
    é est codé sur deux octets 0xC3 0x19, on obtient donc é suivi de deux espaces
   € est codé sur trois octets 0xE 0x82 0xAC, on obtient donc € suivi d'une seul espace
Autrement dit quand tu as des chaînes de longueur variable en octets, tu auras en sortie des alignements irréguliers.

Dans ma seconde commande la valeur de $car est substituée par %s et une chaîne vide est substituée par %-4s. Tu auras donc toujours 4 espaces en sortie.
C'est équivalent à :

empty=""
printf "%s%-4s=\n"  "$car" "$empty"

Dernière modification par bruno (Le 03/04/2020, à 14:17)

Hors ligne

#10 Le 03/04/2020, à 14:24

ar barzh paour

Re : [Résolu] printf serait-il buggé comme cut ?

@bruno
ah j'étais en train d'écrire quelque chose sur la longueur des chaines obtenues !!!!!

car="€";empty="";var=$(printf "%s%-4s"  "$car" "$empty")
echo ${#var}
5

Dernière modification par ar barzh paour (Le 03/04/2020, à 14:31)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

Hors ligne

#11 Le 03/04/2020, à 14:28

bruno

Re : [Résolu] printf serait-il buggé comme cut ?

Oui j'ai vu wink
J’espère que mon explication est suffisamment claire. (man printf ne l'est pas forcément…)

Hors ligne

#12 Le 03/04/2020, à 14:31

ar barzh paour

Re : [Résolu] printf serait-il buggé comme cut ?

@ bruno
merci pour l'explication!!!!


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

Hors ligne