Forum Programmation.autre Renommage de fichier - regex

Posté par  . Licence CC By‑SA.
Étiquettes :
1
10
juil.
2023

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  (site web personnel) . Évalué à 3.

    rename -n 's/(\d{1,2})B(\d{1,2})/sprintf("%02dB%02d",$1,$2)/e'
    

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # je ferai simple

    Posté par  . Évalué à 3.

    
    s/^(.*)[.]([0-9]{1}B[0-9]{1,2}[.].*)$/\1.0\2/;
    s/^(.*[.][0-9]{2})B([0-9][.].*)$/\1B0\2/
    
    

    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  . É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  . Évalué à 1.

        Bon pas moyen de faire passer la regex

        • [^] # Re: je ferai simple

          Posté par  (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  . Évalué à 1.

            Nouvel essai 'afficher

            expression

            /^(.*)[.]([0-9]{1}[x|X][0-9]{1,2})[.](.*)$/gm

  • # Une réponse

    Posté par  . Évalué à 2.

    la version regex101

    ([^0-9]+)(\.)([0-9]+)(B)([0-9]+)(\.)([^0-9]+)(\.)(.+)

    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  . Évalué à 1.

      Merci à tous pour vos conseils ce qui m'a permis d'arriver à une solution

      au final, exemple

      Donc avec

      ^(.*)[.]([0-9]{1})(b|B)([0-9]{1,2})[.](.*)$
      

      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  (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  . É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.

  • # Sans regex

    Posté par  . É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.