IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Regex, caractères spéciaux.


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut Regex, caractères spéciaux.
    Bonjour à tous,
    J'ai deux petites questions.
    J'ai des fichiers écrits en Français que je voudrais un peu uniformiser, dans la mesure ou je ne voudrais garder que les 26 lettres de l'alphabet en minuscule, sans accent.
    Pas de ponctuation non plus.

    J'ai déjà fait ça pour tout écrire en minuscule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -i -lape's/(\w)/\L$1/g' file
    (l'option -i pour faire la modification directement dans le fichier).

    Par contre, pour les accents et autres symboles bizarre, je crains que ce soit un peu rébarbatif de tout prendre en compte, et je risque fort d’oublier des cas de figures et des symboles, donc je me demandais si quelqu'un savait ou trouver un code traitant tous les cas possibles. Voir peut être qu'on peut faire ça autrement.

    DEUXIEME QUESTION:

    J'ai un répertoire "Rep" qui contient des sous répertoire qui contiennent des fichiers, mais il y en a beaucoup (énormément).
    Lorsque j'execute un script perl de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl script.pl rep/*/*.txt
    J'ai le message "liste d'argument trop longue".

    Je sais que c'est une façon de faire dégueulasse, et je me demandais comment pallier ce problème, idéalement comment exécuter un script prenant en entrée tous les fichiers dans l'arborescence du répertoire.

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Pour les lettres accentuées et autres, tu peux utiliser ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr/àéèùçâêîôû/aeeucaeiou/;
    Je ne sais pas si c'est ce dont tu as besoin, mais c'est bien plus rapide à écrire (et certainement à exécuter) qu'une série de s///g.


    Pour la seconde question, tu peux mettre commande suivante au début de ton script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @liste = glob ("rep/*/*.txt");
    Ou, si tu veux passer le chemin en paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @liste = glob (shift);
    en appelant ton programme ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl script.pl "rep/*/*.txt"

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut
    Merci beaucoup pour tes réponses.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Par défaut
    En fait pour la deuxième question, ça ne résout pas tout à fait mon probleme. En effet, je veux appeller un script sur tous les fichiers en mode slurp c'est à dire par exemple si je veux compter le nombre de ligne de l'ensemble des fichiers:

    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl script.pl rep/*/*.txt
    J'ai toujours liste d'arguments trop longues.

    Et je ne vois pas comment faire avec une liste obtenue avec un glob.

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Voici une commande qui affiche le nombre de lignes des fichiers *.pl de mon répertoire courant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -e '@liste = glob (shift); for (@liste) { push @ARGV, $_; $count++ while <>;}; print $count, " lignes \n";' "*.pl"
    2719 lignes
    Ou, plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -e '@ARGV = glob (shift); $count++ while <>; print $count, " lignes.\n";' "*.pl"
    2719 lignes.
    Remarque: bien sûr, le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -ne '$count++; END{print $count, "\n"}' *.pl
    2719
    est encore plus simple, mais là, j'aurais sans doute la même erreur que toi ("liste d'arguments trop longue") si le nombre de fichiers présents est trop élevé, alors que tu ne devrais en principe pas l'avoir avec les deux premiers scripts unilignes.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pour supprimer les accents, il y a aussi le module CPAN Text::Unaccent::PurePerl (il traite tous les diacritiques, il compris sur les majuscules).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Regex deux mots minimum et caractères spéciaux
    Par Shinosha dans le forum Langage
    Réponses: 10
    Dernier message: 04/08/2012, 16h01
  2. Remplacer les caractères spéciaux dans un prénom(Regex)
    Par sajodia dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 17/05/2011, 17h19
  3. [Regex] Supprimer les caractères spéciaux
    Par Jaynes dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 02/05/2011, 17h27
  4. [Regex] Remplacer caractéres spéciaux par leurs correspondants "normaux"
    Par dragonfly dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/09/2008, 10h15
  5. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo