Je dirais même qu'une phrase peut se terminer par plusieurs caractères qui se suivent :
Sans commentaire...
Mais que se passe-t-il ?!
Wouhou !!!!!!!!!!!!
Du coup, ça donnerait :
Pour ce qui est d'ajouter les points de suspensions "…" (Alt+0133 sous Windows), ça dépend un peu trop de l'environnement, et si on part là dedans, il faut aussi ajouter les caractères inversés par exemple (¿ et ¡)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 perl -e "$_ =shift; $wc = split /\s/; $pc = split /[\.\?\!]+/; print qq/ $wc mots\n $pc phrases\n/;" "ma phrase à compter. Ma deuxième phrase... Une autre ? Ok :-) !!!! Merci." 15 mots 5 phrases
Bonjour,
Question: Comment modifier les formats de date dans un fichier?
Chapitre : unilignes
Testé sous : Linux, HP-UX, VMS, Windows (MS-DOS)
Cette commande remplace les tirets par des slash dans le fichier (sans création d'un fichier temporaire intermédiaire) et fait donc passer les dates du format 13-09-2010 au format 13/09/2010 :
Cette commande fait passer toutes les dates de tous les fichiers *.CSV en entrée du format 13/09/2010 au format 2010-09-13 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -pi -e 's/-/\//g;' fichier.txt
Remarque: sous DOS, le *.csv n'est pas interprété correctement, il faut sans doute traiter chaque fichier individuellement, ou utiliser la syntaxe proposée par Alek-C:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -pi -e 's/;(\d\d)\/(\d\d)\/(\d{4})/;$3-$2-$1/g' *.csv
Cette commande fait passer toutes les dates de tous les fichiers *.txt en entrée du format “2000-10-16 17:12:23” au format “16/10/2000”:
Code : Sélectionner tout - Visualiser dans une fenêtre à part FOR %A IN (*.CSV) DO perl -pi.bak -e "s/;(\d\d)\/(\d\d)\/(\d{4})/;$3-$2-$1/g" %A
Même remarque que précédemment sous DOS.
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -pi -e 's/;(\d{4})-(\d\d)-(\d\d) \d\d:\d\d:\d\d/;$3\/$2\/$1/g' *.txt
Question: Comment mettre en minuscules (majuscules) tous les fichiers d'un répertoire?
Chapitre : unilignes
Testé sous: HP-UX, Linux.
Commande Perl qui met en minuscules tous les noms de fichiers du répertoire courant:
Et pour mettre en majuscules les noms de fichiers commençant par “ad_” dans le répertoire courant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -e 'for (@ARGV) { rename $_, lc($_) unless -e lc($_); }' *
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -e 'for (@ARGV) { rename $_, uc($_) unless -e uc($_); }' ad_*
Question: Comment affichier la ligne n° 2 501 743 d'un fichier?
Chapitre : unilignes
Testé sous: HP-UX, Linux, VMS, MS-DOS.
J'avais un programme perl traitant un très gros fichier. A un moment donné, j'ai le message d'erreur suivant: utilisation de valeur non initialisée à la ligne 2501743 du fichier. Comment retrouver cette ligne pour comprendre la source de l'erreur?
Commande Perl qui affiche la ligne N° 2 501 743 d'un fichier:
Autre version plus compacte et sans doute un peu plus rapide:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -n -e '{$i++; print $_ if $i == 2501743;}' nom_fichier.txt
Version encore plus compacte utilisant la variable par défaut $_ de print:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print $_ if $. == 2501743;' nom_fichier.txt
Autre version plus compacte pour imprimer les lignes N° 20 à 60 d'un fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print if $. == 2501743' nom_fichier.txt
Même syntaxe pour n'imprimer qu'une seule ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print if 20 .. 60' nom_fichier.txt
Si le fichier est beaucoup plus gros que 2501743 lignes, la commande Perl suivante sera beaucoup plus rapide que les précédentes parce qu'elle abandonnera la recherche dès que la ligne est affichée:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print if 30..30' nom_fichier.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print and exit if $. == 2501743;}' nom_fichier.txt
Commande qui affiche le numéro de ligne au début de chaque ligne d'un fichier, séparé du reste de la ligne par un espace:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -n -e 'print qq/$. $_/' file_in
Lolo78
bon, pour certains cas, je pense que je préfèrerais sed ^^ mais il y a de très bonne idées, et surtout, ça ouvre d'autres possibilités !
Peut-être une petite remarque pour les débutants par rapport à la partie "conversions de dates" (notamment le premier exemple) puisque tous les tirets seront convertis, qu'ils soient ou non utilisé dans une date !
De même, dans l'exemple suivant, il faut que la date soit précédée d'un ";"
Pour la gestion de plusieurs caractères sous dos, le plus simple que j'ai trouvé est d'utiliser FOR:
Code : Sélectionner tout - Visualiser dans une fenêtre à part FOR %A IN (*.CSV) DO perl -pi.bak -e "s/;(\d\d)\/(\d\d)\/(\d{4})/;$3-$2-$1/g" %A
Q/R : Compter des occurences dans un fichier
Chapitres : uniligne
Testé sous : Linux, Windows
La commande suivante permet de compter pour chaque ligne le nombre d’occurrences d'un motif donné... y'a ptet plus simple (avec ou sans Perl), mais je n'ai trouvé que ça rapidement ^^
Dans mon cas, je voulais vérifier le nombre de pipe pour chaque ligne d'un fichier (en utilisant un petit | uniq après la commande suivante) :
printf réalise un print formaté
Code : Sélectionner tout - Visualiser dans une fenêtre à part > perl -ne "printf qq|%d\n|,$m=()=$_=~m/\|/g;" <fichier>
qq|...| permet d'éviter l'utilisation des " parfois problématiques sous Windows ou dans les alias. Cette commande est équivalente à "..."
%d\n indique à printf d'afficher le premier argument au format décimal suivi d'un saut à la ligne
$m=()=m/\|/g; le secret, c'est l'assignation de l'expression m/\|/g à une liste anonyme () qui renvoie donc la liste des occurrences pour chaque ligne; puis, l'évaluation de cette liste dans un context scalaire avec $m=... qui provoque l'évaluation du nombre d'éléments de la liste
voir ici pour plus de détails et d'autre opérateurs sympas
ps.: \| est ici la chaine cherchée, on peut évidemment la remplacer...
Clairement, les unilignes que je propose sont adaptés aux données sur lesquelles je les utilise. En l'occurrence, il n'y a que dans les dates qu'il y avait des tirets, le reste était constitué uniquement de données alphanumériques (numéro de client, numéro de dossier, type d'offre, etc.) séparées par des points-virgules. J'ai clairement dit que ça remplaçait les tirets par des slash, par uniquement dans les dates. Ce genre d'uniligne doit généralement être adapté au problème exact à résoudre.
Merci pour ton astucieuse suggestion sur la gestion des fichiers DOS multiples, j'ai ajouté ta proposition dans mon post.
Bonjour,
Je vais rajouter vos 4 unilignes Perl suivants*:
- Comment modifier les formats de date dans un fichier?
- Comment mettre en minuscules (majuscules) tous les fichiers d'un répertoire?
- Comment affichier la ligne n° 2 501 743 d'un fichier?
- Compter des occurences dans un fichier.
Juste une petite remarque Lolo78. Lorsque tu dis que tes codes sont compatibles Windows (MS-DOS), attention car c'est faux pour la simple raison que ça ne fonctionne pas à cause des simples quotes (perl -e '' au lieu de perl -e "...").
Vos quatre unilignes ont été rajoutés dans la FAQ Perl.
Super. Du coup j'en ajoutrerai d'autres.
Question: Comment imprimer le quatrième mot de chaque ligne (émulation de la commande cut d'Unix)
Chapitre : unilignes
Testé sous: HP-UX, Linux (mais doit aussi marcher sous Windows et VMS en remplaçant les apostrophes par des guillemets)
Imprime le quatrième mot de chaque ligne, sauf si la ligne commence par un #, le séparateur entre les mots étant le ”;” :
Imprime le cinquième et le deuxième mot de chaque ligne, séparés par un espace, sauf si la ligne commence par un # ou par un nombre quelconque d'espaces suivis d'un # (le séparateur étant toujours le ";"):
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -naF";" -e 'next if /^#/; print qq/$F[3]\n/' fichier.txt
Commande qui enlève le dernier champ d'un fichier, à condition qu'il n'y ait pas de ”;” à la fin de ce dernier champ (en fait, on veut supprimer tout ce qui suit le dernier ";")
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -naF";" -e 'print qq/$F[4] $F[1]\n/ unless /^ *#/' fichier.txt
Le fichier exemple en entrée:
On veut supprimer le dernier champ (par exemple ”[[54”) quand il existe, en utilisant cette fois une expression régulière “gourmande” qui garde tout ce qui précède le dernier ”;”, celui-ci compris.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 114280099;0.0.0.1 /account 2034354645;1;0; 114280193;0.0.0.1 /account 2034360011;1;0;[[54 114280220;0.0.0.1 /account 2034362388;1;0; 117805929;0.0.0.1 /account 8451327160;1;0;[[51 ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne '/(.*;)/; print qq/$1\n/' compte.txt > output.txt
Question: Comment supprimer les lignes vides d'un fichier
Chapitre : unilignes
Testé sous: HP-UX et Linux (ainsi que VMS et Windows en remplaçant les apostrophes par des guillemets)
Pour retirer d'un fichier toutes les lignes vides ou ne comprenant que des espaces blancs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print unless /^\s*$/;' mon_fichier.txt > fichier_resultat.txt
Question: Comment supprimer les doublons d'un fichier trié
Chapitre : unilignes
Testé sous: HP-UX, Linux (ainsi que VMS en remplaçant les apostrophes par des guillemets)
J'ai un programme qui compare les données clients entre deux applications différentes. L'une des séries de fichiers de sortie contient la liste des numéros de clients pour lesquels il y a des différences. La nature du traitement de comparaison garantit que les numéros de clients sont triés dans l'ordre ascendant, mais si plusieurs différences ont été trouvées, alors le numéro de client se trouve plusieurs fois à la suite. Je désire créer un fichier sans doublons.
Commande perl qui lit le fichier (préalablement trié) file_in.txt et stocke le résultat dédoublonné dans file_out.txt:
L'option -i de la ligne de commande Perl permet de modifier directement le fichier en entrée (modification “sur place”, sans création d'un second fichier).
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print $_ if $a ne $_; $a=$_;' file_in.txt > file_out.txt
Commande Perl qui dédoublonne tous les fichiers DELTA_*.TXT d'un répertoire (cette version avec variable d'environnement Unix ne marchera que sous Unix ou Linux, une retouche est nécessaire sous VMS):
Au fait, à propos d'ordre de tri: commande perl qui lit le fichier file_in.txt et vérifie que chaque ligne est classée dans un ordre croissant et affiche à l'écran les lignes dans le désordre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ni -e 'print if $a ne $_; $a=$_;' $RESULT_PATH/DELTA_*.TXT
(On peut aussi faire un sort sur le fichier, mais ça peut être plus long avec un gros fichier. Cette commande peut aussi servir de test pour vérifier qu'un fichier est conforme aux specifications.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'chomp; print "$_ $a\n" if $a gt $_; $a=$_;' file_in.txt
Si le fichier est très gros, on peut se contenter d'arrêter la recherche dès la première anomalie rencontrée et afficher les deux lignes fautives ainsi que le numéro de ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -ne 'print "$. $_ $a\n" and exit if $a gt $_; $a=$_;' file_in.txt
Bonjour,
Les trois questions ont été rajoutées dans la FAQ Perl.
Question: Comment lancer plusieurs fois un programme (perl ou autre) avec des paramètres differents
Chapitre : unilignes
Testé sous: VMS et HP-UX, mais devrait marcher de la même façon sous Linux et Windows. (Il faut utiliser des apostrophes pour Linux et Unix, et des guillemets pour VMS et Windows.)
Le programme CHCOEXO345.PL prend en paramètre le nom de la database sur laquelle il doit s'exécuter. On veut le lancer en automatique sur 8 databases.
On le lance normalement avec, par exemple, la commande suivante (sous VMS):
La commande Perl suivante permet de lancer en une seule fois ce programme pour l'ensemble des databases:
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl CHCOEXO345_MATRICE.PL DB07
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -e "`perl CHCOEXO345.PL $_` foreach qw /DB01 DB02 DB03 DB04 DB05 DB06 DB07 DB08/"
Petite amélioration : remplacer
`perl ...
par
`$0 ...
Ceci permet de ne pas se soucier de l'exécutable perl utilisé (dans le cas d'une installation de plusieurs perl). Dans ce cas de figure, le même perl est utilisé pour l'uniligne que pour celui lancé par ``).
Question: Comment déterminer quels sont les modules Perl installés
Chapitre : unilignes
Testé sous: Unix et Linux
Première fois que je fais un script uniligne avec une procédure appelée récursivement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -M5.10.1 -e 'sub search {for $d (glob "$_[0]/*") { -d $d ? search ($d) : say $d;}} search ($_) for (@INC)'
Faut bien un début à tout
Pour rendre ton programme portable partout, notamment Windows, j'ai utilisé qq.
Par contre, ça m'affiche un peu tout et n'importe quoi !
Code : Sélectionner tout - Visualiser dans une fenêtre à part perl -M5.10.1 -e "sub search {for $d (glob qq|$_[0]/*|) { -d $d ? search ($d) : say $d;}} search ($_) for (@INC)"
Tout mon répertoire de perl mais aussi mon répertoire Appdata, Documents...
Pas ce genre de problème sous Unix ou Linux ou Cygwin.
Sous Windows pur, je n'ai aucune idée de la façon dont l'environnement est défini.
On doit pourvoir filtrer
perl -M5.10.1 -e "sub search {for $d (glob qq|$_[0]/*|) { -d $d ? search ($d) : say $d if $d =~ /\.p?/;}} search ($_) for (@INC)"
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager