Traitement avancé du texte
État :
Sommaire
Pré-requis
Objectifs
- Faire la distinction entre la syntaxe utilisée pour l'expansion des noms de fichiers (file globbing) et les expressions rationnelles
Utiliser efficacement les commandes grep
Comprendre des commandes sed simples
Présentation
On utilise grep, fgrep ou egrep pour rechercher un ou plusieurs mots dans un texte. Les mots utilisés pour la recherche sont une combinaison de lettres que l'on appelle les expressions régulières (ou expressions rationnelles). Les expressions rationnelles sont également reconnues par d'autres applications comme sed ou vi.
Les expressions rationnelles
Les expressions rationnelles traditionnelles (regex)
Une expression rationnelle est une séquence de caractères (ou atomes) utilisés pour correspondre à un motif. Les caractères utilisés sont soit des constantes (traitées littéralement) ou des caractères génériques (métacaractères).
Caractères génériques les plus courants |
|
Caractères |
Correspond à |
\<CLÉ |
Mots commençants par "CLÉ" |
MOT\> |
Mots finissant par "MOT" |
^ |
Début de ligne |
$ |
Fin de ligne |
[ Plage ] |
Plage de caractères ASCII |
[^c ] |
Pas le caractère "c" |
\[ |
Interpréter le caractère "[" littéralement |
"ca*t" |
Chaînes contenant "c" puis zéro ou plusieurs "a" puis "t" |
"." |
Correspond à n'importe quel caractère seul |
Les regex étendues (eregex)
Les principales regex étendues sont : +, ?, () et |
Principales eregex |
|
Caractères |
Correspond à |
"A1|A2|A3" |
Chaînes contenant "A1" ou "A2" ou "A3" |
"ca+t" |
Chaînes contenant "ca" suivi par un ou plusieurs "a" puis "t" |
"ca?t" |
Chaînes contenant "ca" suivi par un ou zéro "a" puis "t" |
"ca*t" |
Chaînes contenant "c" puis zéro ou plusieurs "a" puis "t" |
La famille grep
grep
La commande grep prend en charge les expressions rationnelles traditionnelles (regex).
egrep
La commande egrep prend en charge les expressions rationnelles traditionnelles et étendues (eregex).
fgrep
fgrep signifie "fast grep". fgrep interprète les chaînes littéralement : il ne prend pas en charge les expressions rationnelles.
Travailler avec grep
Syntaxe de grep :
grep MOTIF FICHIER
Options les plus courantes de grep |
|
-c |
compte le nombre de lignes qui correspondent au MOTIF |
-f |
obtient le MOTIF à partir d'un fichier |
-i |
ignore la casse (NdT : pour le MOTIF aussi bien que pour les fichiers) |
-n |
indique le numéro de ligne du fichier en entrée |
-v |
affiche toutes les lignes sauf celles contenant le MOTIF |
-w |
correspondance exacte au MOTIF (NdT : man grep) |
Par exemple, pour lister toutes les lignes non vides de /etc/lilo.conf :
grep –v “^$” /etc/lilo.conf
egrep et fgrep
La commande fgrep ne prend pas en compte le sens particulier des expressions rationnelles. Par exemple :
fgrep ‘cat*’ FICHIER
ne trouvera que les mots contenant "cat*". Le principal avantage de fgrep est la possibilité de chercher à partir d'une liste de mots entrée ligne par ligne dans un fichier (disons LISTE). La syntaxe pour une commande de ce type serait :
fgrep –f LISTE FICHIER
La commande egrep prend en compte toutes les expressions rationnelles modernes. On peut également rechercher plusieurs mots clés entrés à la ligne de commande, séparés par des tubes. Par exemple :
egrep “linux|^image” /etc/lilo.conf
sed, l'éditeur en continu
Voilà que nous allons parler de sed. C'est une commande ancienne, à l'origine la seule disponible sur les systèmes UNIX pour la manipulation de texte.
On utilise généralement sed pour rechercher et remplacer des motifs dans du texte. Cette commande prend en charge la plupart des expressions rationnelles.
Débuter avec sed
Syntaxe de sed :
sed [options] ´commande’ [FICHIER_EN_ENTREE]
Le fichier en entrée est facultatif, puisque sed peut aussi travailler avec des redirections de fichiers et des tubes.
Voici quelques exemples, pour lesquels nous travaillerons sur le fichier MODIF.
- Suppression de toutes les lignes commentées :
sed ‘/^#/ d ’ MODIF
Vous noterez que le motif de recherche est placé entre les deux slashs //.
- Remplacement de /dev/hda1 par /dev/sdb3 :
sed ‘s/\/dev\/hda1/\/dev\/sdb3/g’ MODIF
La commande "s" signifie "substitute" (remplacer). Le "g" signifie "global" et force la substitution à être exécutée plusieurs fois si nécessaire pour chaque ligne.
- Si la ligne contient le mot clé CLE, alors remplacer ":" par ";" globalement :
sed ‘ /CLE/ s/:/;/g’ MODIF
Utilisation plus avancée de sed
Vous pouvez exécuter plusieurs commandes en commençant chacune par -e. Par exemple, (1) supprimer chaque ligne vide et (2) remplace "ANCIEN" par "NOUVEAU" sur chaque ligne du fichier MODIF :
sed –e ‘/^$/ d’ -e ‘s/ANCIEN/NOUVEAU/g’ MODIF
On peut également placer ces commandes dans un fichier, disons COMMANDES. Dans ce cas, chaque ligne est interprétée comme une nouvelle commande à exécuter (les guillemets sont inutiles).
Exemple de fichier COMMANDES :
1 s/ancien/nouveau/ /mot/ s/ancien/nouveau/g 23,25 d
Pour utiliser le fichier COMMANDES, on utilisera la syntaxe suivante :
sed -f COMMANDES MODIF
C'est beaucoup plus compact qu'une très longue ligne de commande !
Résumé des options de sed |
|
Option |
Description |
-e |
exécute la commande suivante |
-f |
lit les commandes à partir d'un fichier |
-n |
n'affiche pas les lignes qui n'ont pas été éditées |
Commandes sed |
|
d |
(delete) supprime la ligne en entier |
r |
(read) ajoute le texte lu à partir d'un fichier |
s |
(substitute) remplacer |
w |
(write) écrit la sortie dans un fichier |
Résumé et exercices
Questions de révision
Oui ou Non
l'expression rationnelle étendue "nucle?aire" correspond à nucleaire et nuclaire : _
l'expression rationnelle "baza*r" correspond à bazaar et bazar mais pas bazor : _
l'expression rationnelle étendue "nucle+aire" correspond à nucleaire mais pas à nuclaire : _
l'expression rationnelle "baza*" correspond à bazaar et bazar et bazor : _
Commandes
Commande |
Description (apropos) |
egrep |
affiche les lignes contenant des motifs correspondant en utilisant les expressions rationnelles étendues |
fgrep |
affiche les lignes contenant des motifs correspondant en utilisant des chaînes littérales |
grep |
affiche les lignes contenant des motifs correspondant en utilisant les expressions rationnelles |
sed |
sed (1) - l'éditeur en continu est utilisé pour effectuer des transformations de texte de base sur un fichier en entrée (fichier ou entrée provenant d'une redirection) |
Travaux pratiques
Créez un fichier FICHIER contenant :
Using grep, fgrep and egrep to grep for 99% of the cats % these are two % commented lines
utilisez grep pour afficher les lignes non commentées
- trouvez les lignes contenant exaxtement "grep" (pas "egrep" ni "frep". Utilisez "-w")
- trouvez les lignes contenant des mots commençant par "a"
Expressions rationnelles : ajoutez les lignes suivantes à FICHIER :
ct cat caats caaatss ca+t ca*t ca?t crate carts
consultez les sorties des commandes suivantes en utilisant grep, egrep et fgrep :
grep 'ca+t' FICHIER grep 'ca?t' FICHIER grep 'ca.t' FICHIER grep 'caa*t' FICHIER grep 'ca*r.' FICHIER
utilisez la commande sed pour effectuer les modifications suivantes dans FICHIER : (utilisez un fichier COMMANDE, puis recommencez le tout en ligne de commande)
- première ligne, remplacez "grep" par "soap"
- supprimez "fgrep" de la deuxième ligne
- remplacez "egrep" par "water"
- quatrième ligne, remplacez "grep for" par "wash"
Enregistrez le résultat dans un fichier en utilisant l'option "w".
Réponses aux questions
oui : l'expression "e?" se lit "correspond à 0 ou 1 e"
oui : l'expression "a*" se lit "correspond à 0 ou plusieurs a"
oui : l'expression "e+" se lit "correspond à 1 ou plusieurs e"
oui : notez que "a*" est placé à la fin de l'expression. Ceci signifie que "baz" suivi par tout ce qu'on veut correspond.
Page consultée 483 fois