#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
Hors 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
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 :
${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
rien ne dit davantage que le fichier contiendra toujours le nom d'un jpeg.
C'est vrai.
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...)
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