Contenu | Rechercher | Menus

Annonce

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 31/12/2022, à 16:25

lucid_xav

[Résolu] Bash - caractères invisibles = nonprintable caractères

Bonjour,

J'ai un fichier ligne.txt qui contient cette ligne :
04/05/2018 - 16:52 - IMG-20180504-WA0001.jpg

Je voudrais récupérer le champ 5 qui correspond à un fichier existant pour le copier. Quand j'utilise la commande suivante, en me plaçant dans le répertoire où se trouve le fichier IMG-20180504-WA0001.jpg, j'obtiens le retour suivant :

al@brad:~/Projets/projet_WA/images$ cp `cat ../ligne.txt | cut -f 5 -d " "` dest
cp: impossible d'évaluer 'IMG-20180504-WA0001.jpg': Aucun fichier ou dossier de ce type
al@brad:~/Projets/projet_WA/images$

Pourtant, si je copie la valeur du message d'erreur ci-dessus "IMG-20180504-WA0001.jpg" avec la souris et que je remplace dans la commande l'expression `cat ligne.txt | cut -f 7 -d " "` par le contenu du presse papier, la commande cp s’exécute correctement :

al@brad:~/Projets/projet_WA/images$ cp IMG-20180504-WA0001.jpg dest
al@brad:~/Projets/projet_WA/images$ ls dest
dest
al@brad:~/Projets/projet_WA/images$

Crazy, non ?
Quelle est la différence entre la chaine de caractère issue de la ligne de commande et celle issue du presse papier ? Comment faire fonctionner ma commande ?

Merci d'avance

Xavier

Dernière modification par lucid_xav (Le 01/01/2023, à 12:11)

Hors ligne

#2 Le 31/12/2022, à 17:12

Watael

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

salut,

comment a été créé le fichier ?


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#3 Le 31/12/2022, à 18:37

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Bonjour Watael,

Le fichier complet originel a été généré par l'App WhatsApp executée sous android, c'est une sauvegarde de discussion WA.
Le fichier ligne.txt est une copie dont je n'ai conservé qu'une ligne.

EDIT : la commande file retourne :

al@brad:~/Projets/projet_WA$ file ligne.txt
ligne.txt: UTF-8 Unicode text
al@brad:~/Projets/projet_WA$ 

Xavier

Dernière modification par lucid_xav (Le 01/01/2023, à 10:45)

Hors ligne

#4 Le 31/12/2022, à 20:30

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Quand je regarde la longueur de la chaine de caractère issue du script, le retour est 24 :

al@brad:~/Projets/projet_WA/images$ script=`cat ../ligne.txt | cut -f 5 -d " "`
al@brad:~/Projets/projet_WA/images$ echo ${#script}
24
al@brad:~/Projets/projet_WA/images$ 

Si je peuple une variable avec la copie de ce retour et que je regarde la longueur, ça donne ça :

al@brad:~/Projets/projet_WA/images$ copier=IMG-20180504-WA0001.jpg
al@brad:~/Projets/projet_WA/images$ echo ${#copier}
23
al@brad:~/Projets/projet_WA/images$

J'en conclue que la commande :

cat ligne.txt | cut -f 5 -d " " 

retourne un caractère qui n'est pas affiché.

C'est possible ?

Bon réveillon à tous !

Dernière modification par lucid_xav (Le 01/01/2023, à 10:56)

Hors ligne

#5 Le 31/12/2022, à 23:54

Watael

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

que dit 

$ cat -v ligne.txt

?
et

$ od -c ligne.txt

?

et puis, s'il te plaît, utilise la balise CODE (le bouton <>) pour coller le résultat, et plus généralement du code.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#6 Le 01/01/2023, à 00:28

Ayral

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Modération : balises posées. Pensez à le poser vous même. SVP


Pour mettre les retours de commande entre deux balises code, les explications sont là : https://forum.ubuntu-fr.org/viewtopic.php?id=1614731
Blog d'un retraité
Site de graphisme du fiston Loïc
Ubuntu 22.04 LTS sur un Thinkpad W540

En ligne

#7 Le 01/01/2023, à 11:01

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Bonjour à tous, et bonne année.

$ cat -v ligne.txt
04/05/2018 - 16:52 - M-bM-^@M-^NIMG-20180504-WA0001.jpg (fichier joint)
$
$ od -c ligne.txt
0000000   0   4   /   0   5   /   2   0   1   8       -       1   6   :
0000020   5   2       -     342 200 216   I   M   G   -   2   0   1   8
0000040   0   5   0   4   -   W   A   0   0   0   1   .   j   p   g    
0000060   (   f   i   c   h   i   e   r       j   o   i   n   t   )  \n
0000100
$

Et merci Ayral pour le lien vers les balises.

Xavier

Hors ligne

#8 Le 01/01/2023, à 11:48

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Merci Watael pour les questions, elles m'ont aiguillé vers une solution :

al@brad:~/Projets/projet_WA$ script=`cat -v ligne.txt | cut -f 5 -d " " | cut -f 2 -d "N"`
al@brad:~/Projets/projet_WA/images$ [[ $script == $copier ]] && echo "egal" || echo "different"
egal
al@brad:~/Projets/projet_WA$

Bonne année à tous !

Xavier

Hors ligne

#9 Le 01/01/2023, à 11:58

diesel

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Je te proposerais bien un :

grep -o -e "[0-9A-Za-z-]*.jpg" ligne.txt

Bonne années à toutes et à tous.

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 01/01/2023, à 12:08)


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

#10 Le 01/01/2023, à 12:17

Watael

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

lucid_xav a écrit :

Merci Watael pour les questions, elles m'ont aiguillé vers une solution :

al@brad:~/Projets/projet_WA$ script=`cat -v ligne.txt | cut -f 5 -d " " | cut -f 2 -d "N"`
al@brad:~/Projets/projet_WA/images$ [[ $script == $copier ]] && echo "egal" || echo "different"
egal
al@brad:~/Projets/projet_WA$

ou proprement, en bash :

$ read -ra line < ligne.txt
$ ficName="${line[@]: -1}"
$ ficName="${ficName##*$'\xE2\x80\x8E'}"
$ echo "$ficName" | od -c
0000000   I   M   G   -   2   0   1   8   0   5   0   4   -   W   A   0
0000020   0   0   1   .   j   p   g  \n
$

Dernière modification par Watael (Le 01/01/2023, à 12:18)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#11 Le 01/01/2023, à 14:53

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Est-ce que tu pourrais m'expliquer ton code, stp ?

$ read -ra line < ligne.txt
$ ficName="${line[@]: -1}"
$ ficName="${ficName##*$'\xE2\x80\x8E'}"

Je comprends la première ligne, mais je ne comprends pas les manips que tu fais pour peupler ficname.

Dernière modification par lucid_xav (Le 01/01/2023, à 14:54)

Hors ligne

#12 Le 01/01/2023, à 15:38

Watael

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

ficName reprend le dernier élément du tableau line, duquel on supprime le préfixe correspondant au motif indiqué (342 200 216 converti en hexadécimal).


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#13 Le 01/01/2023, à 18:25

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Bon, j'ai encore beaucoup à pratiquer pour devenir fluent en bash !

Merci pour ton coup de main en tout cas. C'est fou ce qu'un sachant peut apporter quand on est bloqué...

Hors ligne

#14 Le 01/01/2023, à 19:21

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Watael,

Quand j'exécute le code que tu m'as indiqué, je n'ai pas le même comportement que toi :

$ read -ra line < ligne.txt
$ echo $line
04/05/2018
$

Qu'en penses-tu ?

Ensuite, ce que je n'arrive toujours pas à comprendre, c'est l'expression "##*$" dans la troisième ligne.

Xavier

Dernière modification par lucid_xav (Le 01/01/2023, à 19:22)

Hors ligne

#15 Le 01/01/2023, à 20:05

Tawal

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Hello,

La variable line est un tableau indicé.
On fait référence à ses éléments avec cette forme : ${nom_du_tableau[indice]}
L'appel à $line fait référence au premier élément du tableau line (par convention).

Edit:
Quant à ta 2ième question :

man bash a écrit :

${paramètre##mot}
              Retrait du motif correspondant au préfixe. Le mot est développé pour fournir un motif, comme dans le développement des chemins et mis en correspondance avec la valeur développée du paramètre avec les règles décrites dans Motifs génériques ci-dessous. Si le motif correspond au début de la valeur du paramètre, alors le développement prend la valeur développée du paramètre après suppression  du  plus court (cas « # ») ou du plus long (cas « ## ») motif correspondant. Si le paramètre est @ ou *, l'opération de suppression de motif est appliquée à chaque paramètre positionnel tour à tour et le développement est la liste résultante. Si le  paramètre est une variable tableau indicée par @ ou *, l'opération de suppression de motif est appliquée à chaque élément du tableau tour à tour et le développement est la liste résultante.

Dernière modification par Tawal (Le 01/01/2023, à 20:20)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#16 Le 01/01/2023, à 20:46

diesel

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Je trouve ça assez cochon comme code.

En effet, vous faites tout un tas d'hypothèses non vérifiées sur la structure du fichier ligne.txt. Par exemple, qu'est-ce qui vous garantit que la chaîne de caractères (en octal) "\342 \200 \216" sera toujours la même ?

N'en déplaise à Watael si ce n'est pas du bash mais je trouve beaucoup plus robuste de chercher la chaîne de caractères ".jpg" précédée de caractères imprimables ; ce qui est bien le but recherché.

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

#17 Le 01/01/2023, à 22:57

Watael

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

rien ne dit davantage que le fichier contiendra toujours le nom d'un jpeg.
alors que l'indication du sens de lecture (c'est ce que signifient les caractères échappés), lui, risque bien de toujours faire partie du format du fichier.

Dernière modification par Watael (Le 01/01/2023, à 22:59)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#18 Le 02/01/2023, à 08:49

diesel

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Watael a écrit :

rien ne dit davantage que le fichier contiendra toujours le nom d'un jpeg.

C'est vrai.

Watael a écrit :

alors que l'indication du sens de lecture (c'est ce que signifient les caractères échappés), lui, risque bien de toujours faire partie du format du fichier.

J'ignorais la signification des caractères échappés.

Finalement, cela veut surtout dire que nous n'avons qu'une vision partielle du problème à résoudre et que dans ces conditions, difficile d'avoir des certitudes sur la meilleure manière de le résoudre.

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 02/01/2023, à 08:50)


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

#19 Le 03/01/2023, à 17:07

lucid_xav

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Bonjour tout le monde,

Merci Tawal, c'est exactement le niveau d'information dont j'avais besoin. (c'est à dire depuis la base...)

diesel a écrit :

Finalement, cela veut surtout dire que nous n'avons qu'une vision partielle du problème à résoudre et que dans ces conditions, difficile d'avoir des certitudes sur la meilleure manière de le résoudre.

C'est vrai, au moins en partie. J'avais indiqué la provenance du fichier texte (whatsapp) dans les premiers posts. Après, je ne sais pas si leurs développeurs vont garder le même format de fichier d'export, ni s'ils vont conserver le format jpg des images.

Pour info, j'ai utilisé le code

grep -o -e "[0-9A-Za-z-]*.jpg" ligne.txt

dans mon script, parce que je sais que dans mon fichier toutes les images sont au format jpg et parce que je ne vais a priori l'utiliser qu'une seule fois et uniquement sur ce fichier texte. Ce code a donné pleine satisfaction.

Mais je viens donc d'apprendre qu'il existe des tableaux dans bash, ce que j'ignorais, et je vais creuser ça dans un futur proche.

Merci à vous trois pour vos réponses qui m'ont fait progresser, même si je pars de loin. En tout cas j'ai réussi à faire ce que je voulais et c'est pour moi le principal.

Xavier

Hors ligne

#20 Le 03/01/2023, à 18:44

diesel

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Attention quand-même, le regex que je t'ai donné ne prend pas en compte les caractères accentués.

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

#21 Le 03/01/2023, à 21:00

Tawal

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

Hello,

Pour considérer les caractères accentués, on peut utiliser une classe de caractère prédéfinie : [:alnum:]
Donc la commande devient :

grep -o -e "[[:alnum:]]*.jpg" ligne.txt

Edit:
Il faut pour que ça fonctionne, que les locales soient réglées sur une langue utilisant des caractères accentués.

$ grep -o -e "[[:alnum:]]" <<<$'é'
é
$ LANG=C grep -o -e "[[:alnum:]]" <<<$'é'
$ 

Dernière modification par Tawal (Le 03/01/2023, à 21:03)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#22 Le 03/01/2023, à 22:40

diesel

Re : [Résolu] Bash - caractères invisibles = nonprintable caractères

C'est bizarre.

J'avais lu que [:alnum:] était équivalent à [A-Za-z0-9]. là par exemple : https://www.petefreitag.com/cheatsheets … r-classes/

Et pourtant, j'ai essayé ; dans la vraie vie, ça marche aussi avec les caractères accentués.

Par contre, la commande exacte qui marche pour lucid_xav est :

grep -o -e "[[:alnum:]-]*.jpg" ligne.txt

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 03/01/2023, à 22:48)


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