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 07/07/2018, à 00:10

vlk

Bash récupération une parie du nom de fichier.

Bonjour,
j'ai un fichier 1234_nom_autre.pdf.
j'aimerai savoir comment récupérer dans une variable tout ce qui se trouve avant le premier _ , dans mon exemple je veux récupérer 1234.

Merci.

Hors ligne

#2 Le 07/07/2018, à 02:47

Watael

Re : Bash récupération une parie du nom de fichier.

salut,

as-tu lu la doc indiquée par zipe31 ?


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

Hors ligne

#3 Le 07/07/2018, à 05:42

pingouinux

Re : Bash récupération une parie du nom de fichier.

Bonjour,

nom="1234_nom_autre.pdf"

Voici trois méthodes :

prefix=$(cut -d_ -f1 <<<"$nom")
prefix=$(sed 's/_.*//' <<<"$nom")
prefix=$(grep -Eo '^[^_]+' <<<"$nom")

Édité :
Et pour ne rien récupérer si le nom ne contient pas de "_" :

prefix=$(sed -n 's/_.*//p' <<<"$nom")

ou

prefix=$(grep -Po '^[^_]+(?=_)' <<<"$nom")

Dernière modification par pingouinux (Le 07/07/2018, à 07:33)

Hors ligne

#4 Le 07/07/2018, à 08:01

MicP

Re : Bash récupération une parie du nom de fichier.

Bonjour

michel@debg53sw:~$ nom="1234_nom_autre.pdf"
michel@debg53sw:~$ echo ${nom%%_*}
1234
michel@debg53sw:~$ 

Dernière modification par MicP (Le 07/07/2018, à 08:02)

Hors ligne

#5 Le 07/07/2018, à 08:50

vlk

Re : Bash récupération une parie du nom de fichier.

Bonjour et merci pour vos pistes.
La solution à MicP fonctionne parfaitement. Quand à celle de pingouinux est plus complète.

Mais voila quand je fais :

nom="1234_nom_autre.pdf"
prefix=$(sed -n 's/_.*//p' <<<"$nom") ou prefix=$(grep -Po '^[^_]+(?=_)' <<<"$nom") ou les autres ....
echo $prefix

ça me renvoie : test.sh: 3: test.sh: Syntax error: redirection unexpected

Une idee sur ce qui cloche ?

Merci.

Hors ligne

#6 Le 07/07/2018, à 08:51

kholo

Re : Bash récupération une parie du nom de fichier.

salut,
+1 @MicP
je dirais même plus :

nom="1234_nom_autre.pdf"

echo "${nom}"
1234_nom_autre.pdf

echo "${nom#*_}"
nom_autre.pdf

echo "${nom##*_}"
autre.pdf

echo "${nom%_*}"
1234_nom

echo "${nom%%_*}"
1234
 

Dernière modification par kholo (Le 07/07/2018, à 08:52)

Hors ligne

#7 Le 07/07/2018, à 08:57

pingouinux

Re : Bash récupération une parie du nom de fichier.

@vlk #5 : Les commandes en #3 doivent être exécutées en bash, et non en sh.

Hors ligne

#8 Le 07/07/2018, à 09:08

vlk

Re : Bash récupération une parie du nom de fichier.

voiw cool ça fonctionne !

Merci bash, sh ça change quoi ?

Hors ligne

#9 Le 07/07/2018, à 09:59

pingouinux

Re : Bash récupération une parie du nom de fichier.

vlk #8 a écrit :

bash, sh ça change quoi ?

bash offre des possibilités supplémentaires, mais sh est plus portable.
Voici une syntaxe acceptée par sh :

prefix=$(echo "$nom" | sed -n 's/_.*//p')

ou

prefix=$(echo "$nom" | grep -Po '^[^_]+(?=_)')

Hors ligne

#10 Le 07/07/2018, à 12:29

vlk

Re : Bash récupération une parie du nom de fichier.

super, merci.

Hors ligne

#11 Le 07/07/2018, à 16:29

vlk

Re : Bash récupération une parie du nom de fichier.

J'ai encore une question,
est il possible après la réception d'un mail avec fetchmail extraire la pièce jointe pour la classer automatiquement ?
si oui quelqu’un a une piste ?

Merci.

Hors ligne

#12 Le 07/07/2018, à 19:23

Watael

Re : Bash récupération une parie du nom de fichier.

nouvelle question => nouveau sujet !


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

Hors ligne

#13 Le 18/08/2018, à 13:39

vlk

Re : Bash récupération une parie du nom de fichier.

Bonjour,
Je reviens sur le sujet ...
Ca fonctionne très bien mais avec un fichier à la fois. Par contre quand le répertoire contient plusieurs fichiers à traiter ça ne marche plus.

Voici mon script :

#!/bin/bash
destination="/home/user/doc2"
source="/home/user/doc1/"
nom=$(ls $source)
rep=$(grep -Po '^[^_]+(?=_)' <<<"$nom")
if [ -d $destination$rep ];then
mv "$source$nom" "$destination$rep/"
else
mkdir $destination$rep && mv "$source$nom" "$destination$rep/"
fi

Donc je suppose qu'il faut créer une boucle et traiter les fichier un après l'autre mais je suis incapable.
Si vous pouvez me donner quelques tuyaux je suis preneur.

Merci.

Hors ligne

#14 Le 18/08/2018, à 18:31

Watael

Re : Bash récupération une parie du nom de fichier.

non, pas var=$(ls $src) !

tableau=( $src/* )
printf '%s\n' "${tableau[@]%%_*}"

Dernière modification par Watael (Le 18/08/2018, à 18:32)


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

Hors ligne

#15 Le 19/08/2018, à 09:56

vlk

Re : Bash récupération une parie du nom de fichier.

merci pour la réponse.
comment dois je faire pour stocker dans une variable que la première ligne du tableau ?

pourquoi pas ls ?

Dernière modification par vlk (Le 19/08/2018, à 11:03)

Hors ligne

#16 Le 19/08/2018, à 15:06

Watael

Re : Bash récupération une parie du nom de fichier.

jamais ls !
parce qu'il ne protège pas les noms de fichiers.
Par exemple, si un fichier se nomme nom de fichier, avec ls le shell utilisera le nom tel quel,
alors qu'avec les Développement des chemins (globs), le shell utilisera 'nom de fichier' : les espaces (entre autres retour à la ligne, caractères spéciaux, et autres invisibles...) seront protégés.
et puis, c'est une commande externe que remplace avantageusement le shell.

les tableaux ne stockent pas les données sous forme de lignes.
ils utilisent des indices commençant par défaut par zéro :

${tableau[0]} #->premier élément
${tableau[1]} #->deuxième élément...

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

Hors ligne

#17 Le 19/08/2018, à 16:59

vlk

Re : Bash récupération une parie du nom de fichier.

j’essaie d'extraire mon nombre mais rien à faire je suis nul !

je lis ça :

echo "US/Central - 10:26 PM (CST)" | sed -n "s/^.*-\s*\(\S*\).*$/\1/p"

c'est magique, ça donne 10:26

-n      suppress printing
s       substitute
^.*     anything at the beginning
-       up until the dash
\s*     any space characters (any whitespace character)
\(      start capture group
\S*     any non-space characters
\)      end capture group
.*$     anything at the end
\1      substitute 1st capture group for everything on line
p       print it

et je capte Z ...

comment former l’expression pour extraire le nombre après le dernier / et avant le premier  _  (le 8 dans mon exemple) ?

echo "/bal/bla/8_bla.pdf" | sed -n "s/^.*_\s*\(\S*\).*$/\1/p"

Hors ligne

#18 Le 19/08/2018, à 17:24

MicP

Re : Bash récupération une parie du nom de fichier.


extraire le nombre après le dernier / et avant le premier  _

Pour un nombre d'un seul chiffre :

michel@debg53sw:~$ echo "/bal/bla/54_/bla/blu8_64_.pdf"          | sed -nr 's|.*/[^0-9]*([0-9])_.*|\1|p;'
8
michel@debg53sw:~$ 
michel@debg53sw:~$ echo "/bal/bla/54_/bla/blu9876543210_64_.pdf" | sed -nr 's|.*/[^0-9]*([0-9])_.*|\1|p;'
michel@debg53sw:~$ 

Pour un nombre d'un ou plusieurs chiffres :

michel@debg53sw:~$ 
michel@debg53sw:~$ echo "/bal/bla/54_/bla/blu8_64_.pdf"          | sed -nr 's|.*/[^0-9]*([0-9]*)_.*|\1|p;'
8
michel@debg53sw:~$ 
michel@debg53sw:~$ echo "/bal/bla/54_/bla/blu9876543210_64_.pdf" | sed -nr 's|.*/[^0-9]*([0-9]*)_.*|\1|p;'
9876543210
michel@debg53sw:~$ 

=======
En n'utilisant que bash (<=> sans sed ni aucun autre programme externe)

michel@debg53sw:~$ maReg='.*/[^0-9]*([0-9]*)_.*'
michel@debg53sw:~$ 
michel@debg53sw:~$ maVar="/bal/bla/54_/bla/8_64_.pdf";
michel@debg53sw:~$ [[ "$maVar" =~ $maReg ]] && echo ${BASH_REMATCH[1]}
8
michel@debg53sw:~$ maVar="/bal/bla/54_/bla/95_64_.pdf";
michel@debg53sw:~$ [[ "$maVar" =~ $maReg ]] && echo ${BASH_REMATCH[1]}
95
michel@debg53sw:~$ maVar="/bal/bla/54_/bla/blu95654_64_.pdf";
michel@debg53sw:~$ [[ "$maVar" =~ $maReg ]] && echo ${BASH_REMATCH[1]}
95654
michel@debg53sw:~$ 

Dernière modification par MicP (Le 19/08/2018, à 23:46)

Hors ligne

#19 Le 19/08/2018, à 17:24

pingouinux

Re : Bash récupération une parie du nom de fichier.

Bonsoir,

$ echo "/bal/bla/8_bla.pdf" | sed -rn "s#[^_]*/([0-9]+)_.*#\1#p"
8
$ sed -rn "s#[^_]*/([0-9]+)_.*#\1#p" <<<"/bal/bla/8_bla.pdf"
8

Hors ligne

#20 Le 19/08/2018, à 17:41

vlk

Re : Bash récupération une parie du nom de fichier.

Merci beaucoup.

Hors ligne

#21 Le 19/08/2018, à 22:00

vlk

Re : Bash récupération une parie du nom de fichier.

sans vouloir abuser, vous pouvez traduit ?

Merci.

Dernière modification par vlk (Le 19/08/2018, à 22:01)

Hors ligne

#22 Le 20/08/2018, à 06:12

pingouinux

Re : Bash récupération une parie du nom de fichier.

vlk a écrit :

sans vouloir abuser, vous pouvez traduit ?

sed -rn "s#[^_]*/([0-9]+)_.*#\1#p" <<<"/bal/bla/8_bla.pdf"
sed -rn "s#chaîne_à_remplacer#chaîne_qui_remplace#p" <<<"/bal/bla/8_bla.pdf

Utilisation de # (ou d'un autre caracrère non présent dans les chaînes) à cause du / dans la chaîne_à_remplacer.
[^_]* : zéro ou plus caractères autres que _
/ : le caractère /
([0-9]+) : 1 ou plus chiffres décimaux (les parenthèses pour utiliser la suite de chifres plus tard avec \1)
_.* : le caractère _ suivi de zéro ou plus caractères quelconques

Hors ligne

#23 Le 20/08/2018, à 08:08

vlk

Re : Bash récupération une parie du nom de fichier.

Merci.

Hors ligne