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 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

ar barzh paour a écrit :

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