#1 Le 08/12/2015, à 13:46
- ar barzh paour
[Résolu] séparateur de liste
bonjour à tous
j'ai encore besoin d'un petit coup de pouce
je veux traiter une liste de fichiers
zenity me renvoie une liste séparé par un pipe
par exemple liste="fich1.jpg|fich2.jpg"
je veux récupérer le nom de chaque fichier renvoyé
et effectuer un traitement particulier sur chaque fichier mais là je butte sur la récupération du nom
for f in "$liste" do echo $f "#######" done
j'obtiens
fich1.jpg|fich2.jpg ######
bon là ok
alors j'essaie cette autre solution sans plus de succès
IFS="|" for f in "$liste" do echo $f "*****" done
j'obtiens
fich1.jpg fich2.jpg *****
je pensais plutôt obtenir
fich1.jpg *****
fich2.jpg *****
et encore le nom des fichiers ici ne contient pas d'espace
dans un autre script j'ai utilisé un truc ignoble , changer les espaces de la liste par un tilde ( en espérant qu'il n'y ait pas de tilde dans le nom des fichiers (ce qui pourrait se produire) , mais j'ai fait l'impasse ) , puis faire un traitement via awk , il faudrait que je retrouve ce script
#!/bin/bash
liste="fich1.jpg|fich2.jpg"
for f in "$liste"
do
echo $f "******"
done
IFS="|"
for f in "$liste"
do
echo $f "#######"
done
read g
echo "
résultat
fich1.jpg|fich2.jpg ******
fich1.jpg fich2.jpg #######
"
read g
donc ce que je cherche à faire par exemple c'est pouvoir lancer
<nom de programme shell> "fich1.jpg"
for f in $liste do <nom_prog_shell> "$f" done
Dernière modification par ar barzh paour (Le 08/12/2015, à 18:37)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#2 Le 08/12/2015, à 14:13
- credenhill
Re : [Résolu] séparateur de liste
hello
$ liste="fich1.jpg|fich2.jpg|aa bb.jpg"
$ while read f; do echo $f; done <<<"${liste//|/$'\n'}"
fich1.jpg
fich2.jpg
aa bb.jpg
edit: et
$ while read -d "|" f; do echo $f; done <<<"${liste}|"
fich1.jpg
fich2.jpg
aa bb.jpg
Dernière modification par credenhill (Le 08/12/2015, à 16:45)
Hors ligne
#3 Le 08/12/2015, à 14:17
- pingouinux
Re : [Résolu] séparateur de liste
Bonjour,
Autre méthode
$ liste="fich 1.jpg|fich 2.jpg"
$ IFS='|' list=($liste)
$ for f in "${list[@]}"; do echo "$f" "#######"; done;
fich 1.jpg #######
fich 2.jpg #######
Ajouté : Ou alors
(IFS="|"; for f in $liste; do echo $f "#######"; done)
Les parenthèses servent à ne pas modifier IFS dans l'environnement courant.
Dernière modification par pingouinux (Le 08/12/2015, à 14:44)
Hors ligne
#4 Le 08/12/2015, à 16:18
- ar barzh paour
Re : [Résolu] séparateur de liste
@credenhill
oui ça fonctionne bien
done <<<"${liste//|/$'\n'}"
peux-tu expliciter la syntaxe ?
@pingouinux
idem
peux-tu expliciter la syntaxe ?
list=($liste)
Dernière modification par ar barzh paour (Le 08/12/2015, à 16:24)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#5 Le 08/12/2015, à 16:32
- credenhill
Re : [Résolu] séparateur de liste
on remplace | par un saut de ligne $'\n' et pas par les 2 car. \n :
$ echo "${liste//|/\n}"
fich1.jpg\nfich2.jpg\naa bb.jpg
$ echo "${liste//|/$'\n'}"
fich1.jpg
fich2.jpg
aa bb.jpg
et <<< envoie la variable modifiée dans le stdin du while read ...
Dernière modification par credenhill (Le 08/12/2015, à 16:44)
Hors ligne
#6 Le 08/12/2015, à 17:35
- pingouinux
Re : [Résolu] séparateur de liste
peux-tu expliciter la syntaxe ?
list=($liste)
IFS='|' list=($liste)
On génère ici un tableau dont chaque élément est un nom de fichier. Voici un extrait de man bash, rubrique Arrays (j'ai une version en anglais)
Arrays are assigned to using compound assignments of the form
name=(value1 ... valuen), where each value is of the form [sub‐
script]=string. Indexed array assignments do not require anything but
string. When assigning to indexed arrays, if the optional brackets and
subscript are supplied, that index is assigned to; otherwise the index
of the element assigned is the last index assigned to by the statement
plus one. Indexing starts at zero.
Hors ligne
#7 Le 08/12/2015, à 18:37
- ar barzh paour
Re : [Résolu] séparateur de liste
!!!!!!
le temps que je revienne sur le forum
deux réponses déjà effectuées
merci @pingouinux et credenhill
j'anote mon bouquin shell
@credenhill
en relisant mes notes j'ai retrouvé la syntaxe
${var//Motif/Remplacement} : remplacement global dans $var de Motif par Remplacement
Dernière modification par ar barzh paour (Le 13/12/2015, à 13:11)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne