Bonjour,
J'aurais besoin de renommer en masse des fichiers.
le nom de fichier est de la forme
text1.00B00.text2.ext
text1 est une chaine de caractère de longueur variable
. un point
00 un chiffre sur 1 ou 2 digit
B la lettre B fixe
00 un chiffre sur 1 ou 2 digit
. un point
text2 est une autre chaine de caractère de longueur variable
.ext l'extension du fichier
le besoin est de remplacer les 2 zones de chiffres par le meme chiffre mais sur 2 digit, exemple:
abcd.1B21.efg.hi.txt
par
abcd.01B21.efg.hi.txt
Pour tester, j'utilise Regex en ligne
J'ai un début de regle pour attraper les chiffres mais je suis loin du compte
regle
.([0-9]{2})B([0-9]{2}).(.*)$
cible
.\$1\x`{mathjax} 2.`
Merci pour votre aide
PS: ce n'est pas la copie à rendre pour demain ( j'ai passé l'age ;-) ) , je n'y connais rien au regexp, j'ai juste besoin d'un coup de main.
# rename, /e
Posté par Krunch (site web personnel) . Évalué à 3.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: rename, /e
Posté par Nanawel (site web personnel, Mastodon) . Évalué à 2.
Sauf erreur, il faut préciser que la commande ci-dessous utilise la version Perl de
rename
(appelée parfoisprename
) et non la version C.Un bon tableau de récap pour savoir où est qui : https://github.com/tldr-pages/tldr/issues/3125#issuecomment-504798216
[^] # Re: rename, /e
Posté par ChocolatineFlying . Évalué à 0. Dernière modification le 11 juillet 2023 à 09:55.
je tenterais :
rename -n 's/.(\d{1,2})B(\d{1,2})./.$1B$2./' *.ext
edit : ne fonctionne pas
# je ferai simple
Posté par fearan . Évalué à 3.
la première ligne sed gère les singleton du premier champ, la deuxième, du deuxième champ; les 2 regexp se décompose ainsi avant le 1er champ, puis le champ suivant. je ne capture pas le caractère précédant le champ pour éviter de me retrouver avec un \10…
la chaine [.] correspond à un '.', cela sans avoir à devoir le protéger par un \ ce qui est chiant, surtout si on commence à jouer avec des interprétations a plusieurs niveau; c'est déjà chiant dans le code; mais en shell…
Je n'ai évidemment pas testé ;)
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: je ferai simple
Posté par dr191 . Évalué à 1.
Merci pour vos suggestions
J'ai trouvé ce site qui est vraiment bien pour comprendre et faire des essais.
Au final, je fais ceci
expression
/.*..$/gm
Oui, j'ai oublié le B majuscule.
substitution par
$1.0$2.$3
Prochaine étape, arriver à remplacer le B par un b !
[^] # Re: je ferai simple
Posté par dr191 . Évalué à 1.
Bon pas moyen de faire passer la regex
[^] # Re: je ferai simple
Posté par BAud (site web personnel) . Évalué à 2.
il faut utiliser dans ton commentaire la balise pour du code, cf. l'aide-édition
ou sinon faire comme dans le commentaire ci-dessous et enregistrer la regex sur le site regex101 :-)
[^] # Re: je ferai simple
Posté par dr191 . Évalué à 1.
Nouvel essai 'afficher
expression
/^(.*)[.]([0-9]{1}[x|X][0-9]{1,2})[.](.*)$/gm
# Une réponse
Posté par DontShootMe . Évalué à 2.
la version regex101
les explications :
- les parenthèses servent à créer des groupes
-
([^0-9]+)
: qui n'est pas entre 0 inclus à 9 inclus, 1 fois ou plus-
(\.)
: le point-
([0-9]+)
: tous ce qui est 0 inclus à 9 inclus, 1 fois ou plus-
([Bb])
: B ou b-
([0-9]+)
: tous ce qui est 0 inclus à 9 inclus, 1 fois ou plus-
(\.)
: le point-
([^0-9]+)
: tous ce qui n'est pas entre 0 inclus à 9 inclus, 1 fois ou plus-
(\.)
: le point-
(.+)
: n'importe quel caractère, 1fois ou plus pour l'extension du fichier (txt)En tous cas cela fonctionne sur :
abcd.1B21.efg.hi.txt
[^] # Re: Une réponse
Posté par dr191 . Évalué à 1.
Merci à tous pour vos conseils ce qui m'a permis d'arriver à une solution
au final, exemple
Donc avec
et
$1.0$2b$4$5
Il faudra une deuxième passe pour le 2ème double digit. Et scripter cela pour renommer les fichiers.
Depuis le temps que je voulais me mettre aux regex.
[^] # Re: Une réponse
Posté par Krunch (site web personnel) . Évalué à 3. Dernière modification le 12 juillet 2023 à 13:47.
Moui alors si tu veux vraiment pas utiliser /e, tu peux quand même simplifier un peu :
rename -n 's/\.(\d)b/.0$1b/i;s/b(\d)\./b0$1./i
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Une réponse
Posté par dr191 . Évalué à 1.
Oula, j'ai pas dit que c'était optimal, mais j'ai compris ce que j'ai fait.
Je n'ai pas compris la subtilité du /e.
merci pour votre autre idée, je vais regarder.
[^] # Re: Une réponse
Posté par Krunch (site web personnel) . Évalué à 2.
/e fait évaluer la deuxième partie comme une expression Perl. Du coup tu peux mettre sprintf("%02d", $1) comme dans ma première solution.
https://perldoc.perl.org/perlre
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
# Sans regex
Posté par cyberjunkie . Évalué à 1.
C'est peut-être HS puisque ça n'utilise pas réellement de regex mais, perso, j'utiliserais l'utilitaire MMV.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.