Introduction au langage Sed 3 – Substitution de texte

Lire l’article précédent : Introduction au langageSed 2 – les adresses

Le point fort de Sed est la substitution de texte. C’est la commande s qui s’en charge. Cette commande est un véritable couteau suisse. Je vous présenterais ici quelques unes de ces nombreuses possibilités.
Voici le format générique de cette commande, que vous allez pouvoir utiliser pour substituer du texte depuis un fichier :

sed 's/motif/remplacement/option' fichier

La partie option est … optionnelle.

Tout d’abord, voici un petit fichier sur lequel vous allez pouvoir faire quelques expériences. Disons que ce fichier représente la base de donnée du service « Ressources Humaines » d’une entreprise. Il possède 3 champs : prénom, nom et fonction, séparés par des blancs. Copiez/collez et enregistrez le sous le nom ‘bd.txt’ :

georges         martin          dev
jean            martin          dev
rené            dupont          com
phil            dupond          com
alain           raymond         dev
martin          dupuis          dev
jean            lamartine       dev

Note : Si vous constatez des choses bizarres dans la console quand vous essaierez les exemples suivants, ajoutez une ligne vide à la fin du fichier ‘bd.txt’.

Modification d’une portion de texte

Admettons que je n’aime pas l’abbréviation ‘com’. Je veux donc que ‘commercial’ apparaisse en toutes lettres :

$ sed 's/com/commercial/' bd.txt
georges         martin          dev
jean            martin          dev
rené            dupont          commercial
phil            dupond          commercial
alain           raymond         dev
martin          dupuis          dev
jean            lamartine       dev

Facile, non ?

Suppression d’une portion de texte

Finalement, je n’aime pas tellement les commerciaux de ma boite, supprimons donc le texte ‘com’ :

$ sed 's/com//' bd.txt
georges         martin          dev
jean            martin          dev
rené            dupont
phil            dupond
alain           raymond         dev
martin          dupuis          dev
jean            lamartine       dev

Reprise du motif trouvé

C’était bien sûr pour rire, je n’ai rien contre les commerciaux. Pour leur prouver, mettons leur fonction en emphase.
Le caractère spécial & est substitué au sein de la chaîne de remplacement par le motif, si celui-ci a été trouvé. C’est donc une substitution dans la substitution !
L’explication est laborieuse mais si vous regardez attentivement l’exemple suivant vous allez voir que c’est en réalité très simple :

$ sed 's/com/<<&>>/' bd.txt
georges         martin          dev
jean            martin          dev
rené            dupont          <<com>>
phil            dupond          <<com>>
alain           raymond         dev
martin          dupuis          dev
jean            lamartine       dev

Quelques options

Je voudrais remplacer chaque caractère ‘e’ par un tiret. Voyons si la commande suivante fonctionne :

$ sed 's/e/-/' bd.txt
g-orges         martin          dev
j-an            martin          dev
r-né            dupont          com
phil            dupond          com
alain           raymond         d-v
martin          dupuis          d-v
j-an            lamartine       dev

Elle ne fonctionne pas. Pourquoi ? Parce que Sed, par défaut, effectue la subsitution uniquement sur le premier motif rencontré. Pour bien remplacer tous les ‘e’, il faut utiliser l’option g, signifiant global :

$ sed 's/e/-/g' bd.txt
g-org-s         martin          d-v
j-an            martin          d-v
r-né            dupont          com
phil            dupond          com
alain           raymond         d-v
martin          dupuis          d-v
j-an            lamartin-       d-v

Et si je veux remplacer uniquement le second caractère ‘e’ de chaque ligne ? Il suffit de donner à Sed l’option 2 et le tour est joué :

$ sed 's/e/-/2' bd.txt
georg-s         martin          dev
jean            martin          d-v
rené            dupont          com
phil            dupond          com
alain           raymond         dev
martin          dupuis          dev
jean            lamartin-       dev

Afficher les noms de famille en majuscules

Pour celles et ceux d’entre vous qui ne maitrise pas les expressions régulières, cet exemple peut être un plus compliqué à comprendre.
Dans le fichier bd.txt, le nom de famille est une suite de caractère, précédé et suivi d’un espace. Ce qui correspond au motif :

/ .* /

Dans une expression rationnele, le point représente n’importe quel caractère et l’étoile signifie « zéro ou plusieurs occurences ».
Le texte de remplacement est :

/\U&/

qui signifie : mettre en majuscule (\U) le motif trouvé (&).

$ sed 's/ .* /\U&/' bd.txt
georges         MARTIN          dev
jean            MARTIN          dev
rené            DUPONT          com
phil            DUPOND          com
alain           RAYMOND         dev
martin          DUPUIS          dev
jean            LAMARTINE       dev

Conclusion

Ce ne sont là que quelques possibilités de la commande de substitution de Sed. Associée aux expressions rationnelles, on voit bien que cette commande peut s’avérer très puissante.

Lire l’article précédent : Introduction au langageSed 2 – les adresses

Références

Livre : Script sous linux http://www.blaess.fr/christophe/livres.php?pg=003

Publicités

, ,

  1. Poster un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :