#1 Le 26/06/2021, à 22:51
- FredBubuntu
sed : expression régulière et accès variable
Bonjour,
je souhaiterais renommer avec la commande "sed" plusieurs fichiers pdf :
ReleveMensuelJanvier2018.pdf
ReleveMensuelFevrier2019.pdf
ReleveMensuelFevrier2020.pdf
...
sous la forme :
2018-01-xx_CPAM_Releve-Mensuel.pdf
2019-02-xx_CPAM_Releve-Mensuel.pdf
2020-02-xx_CPAM_Releve-Mensuel.pdf
...
J'utilise la commande suivante :
declare -A months=( ["Janvier"]="01" ["Fevrier"]="02" ["Mars"]="03" ["Avril"]="04")
for f in *.pdf;
do
fn=`echo $f | sed -r 's/(Releve)(Mensuel)([A-Z].*[a-z]).*([0-9]{4})/\4-'"${months[\3]}"'-xx_CPAM_\1-\2/'`;
echo "$fn"
# mv "$f" "$fn";
done
J'obtiens le résultat suivant:
2018--xx_CPAM_Releve-Mensuel.pdf
2019--xx_CPAM_Releve-Mensuel.pdf
2020--xx_CPAM_Releve-Mensuel.pdf
...
Le mois n'est pas interprété
L'epression régulière \3 n'est pas inetrprétée
Pouvez vous m'aider ?
Frédéric
Dernière modification par FredBubuntu (Le 27/06/2021, à 16:11)
Hors ligne
#2 Le 26/06/2021, à 23:27
- Watael
Re : sed : expression régulière et accès variable
salut,
#!/bin/bash
declare -A months=( ["Janvier"]="01" ["Fevrier"]="02" ["Mars"]="03" ["Avril"]="04" )
rgx="(ReleveMensuel)([^[:digit:]]*)([^.]*)(.*)"
for f in *.pdf
do
[[ $f =~ $rgx ]] && echo "${BASH_REMATCH[3]}-${months[${BASH_REMATCH[2]}]}-xx_CPAM_${BASH_REMATCH[1]}${BASH_REMATCH[4]}"
done
?
Dernière modification par Watael (Le 26/06/2021, à 23:28)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 27/06/2021, à 16:12
- FredBubuntu
Re : sed : expression régulière et accès variable
Merci Watael : c'est superbe !
Merci cqfd93
Dernière modification par FredBubuntu (Le 27/06/2021, à 16:18)
Hors ligne
#5 Le 27/06/2021, à 16:29
- Zakhar
Re : sed : expression régulière et accès variable
Puissant "bashism"
Ça ne répond pas à la question initiale de le faire avec 'sed', ce qui est sans doute possible... mais probablement que la question était une des nombreuses instances "d'expression de solution" au lieu "d'exprimer le besoin".
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#6 Le 27/06/2021, à 16:39
- FredBubuntu
Re : sed : expression régulière et accès variable
Je veux bien la réponse avec sed si quelqu'un peut m'éclairer aussi
Et je trouve la première solution proprosés tout a fait jolie quand même
Hors ligne
#7 Le 27/06/2021, à 16:54
- Watael
Re : sed : expression régulière et accès variable
je ne vois pas comment réaliser la substitution de l'indice du tableau avec une référence arrière...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 27/06/2021, à 18:10
- pingouinux
Re : sed : expression régulière et accès variable
Bonjour,
Pas très joli, mais voici une façon de faire, en reprenant ton sed initial :
for f in *.pdf;
do
sed -r 's/(Releve)(Mensuel)([A-Z].*[a-z]).*([0-9]{4})/\4-\3-xx_CPAM_\1-\2/;s/Janvier/01/;s/Fevrier/02/' <<<"$f"
done
Hors ligne
#9 Le 28/06/2021, à 12:49
- Zakhar
Re : sed : expression régulière et accès variable
C'est vrai que déjà une "array" est un "bashism" à la base, alors un peu plus un peu moins.
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#10 Le 28/06/2021, à 19:17
- LeoMajor
Re : sed : expression régulière et accès variable
Salut,
declare -A months=( ["Janvier"]="01" ["Fevrier"]="02" ["Mars"]="03" ["Avril"]="04")
f=ReleveMensuelJanvier2018.pdf
res=$(eval "echo $(sed -r 's/(Releve)(Mensuel)([A-Z].*[a-z]).*([0-9]{4})/\4-${months[\"'$'\u005c3''\"]} -xx_CPAM_\1-\2---\3/' <<<"$f")")
echo "$res"
# renvoie '2018-01 -xx_CPAM_Releve-Mensuel---Janvier.pdf'
expansion simple quoting $'...' pour la back-reference \3 + eval " ... " pour son expression avec array
~$ sed 'y/éèëê'$'\u0027''/eeee_/' <<<"tête d'hélène"
tete d_helene
$'\u0027' ou ' est remplacé par _
~$ eval 'echo 2018-${months["Janvier"]} -xx_CPAM_Releve-Mensuel---Janvier.pdf'
2018-01 -xx_CPAM_Releve-Mensuel---Janvier.pdf
Hors ligne