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

#3 Le 27/06/2021, à 08:05

cqfd93

Re : sed : expression régulière et accès variable

Modération

Bonjour,

Pour ajouter toi-même les balises code à ton message #1 :

  • Cliquer sur le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message
    1471986854.png


cqfd93

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

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

Ç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 smile
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. big_smile


"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