Traitement avancé du texte

État : {a_reli}

Retour au document principal

Pré-requis

Objectifs

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.

Vous noterez que le motif de recherche est placé entre les deux slashs //.

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

  1. l'expression rationnelle étendue "nucle?aire" correspond à nucleaire et nuclaire : _

  2. l'expression rationnelle "baza*r" correspond à bazaar et bazar mais pas bazor : _

  3. l'expression rationnelle étendue "nucle+aire" correspond à nucleaire mais pas à nuclaire : _

  4. l'expression rationnelle "baza*" correspond à bazaar et bazar et bazor : _

Voir les réponses

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

  1. 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"
  2. 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
  3. 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

  1. oui : l'expression "e?" se lit "correspond à 0 ou 1 e"

  2. oui : l'expression "a*" se lit "correspond à 0 ou plusieurs a"

  3. oui : l'expression "e+" se lit "correspond à 1 ou plusieurs e"

  4. 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 18 fois