sed : chercher et remplacer
Souvent on aimerait chercher une chaîne de caractères et les remplacer par autre chose dans le flux sortant.
L'outil sed (stream editor) est très utile pour cela.
Par exemple, pour remplace tous les mots hello par goodbye :
cat test.txt | sed 's/hello/goodbye/'Avec sed, on structure notre paramètre entrant avec un opérateur suivi par les paramètres. Ici :
s: veut dire substitution (chercher et remplacer). On attend 2 paramtètres suivants, séparés par les slash/hello: veut dire qu'on cherche le mothellogoodbye: le texte à utiliser pour remplacerhello
Lisez plus sur la commande sed :
man sed
Analysez les résultats de `sed` ci-dessus. Est-ce que toutes les instances de `hello` sont bien remplacées ?
Indiquez qu'il faut remplacer toutes les instances, avec le flag g (pour global) de chaque ligne, sinon, on remplace seulement la première trouvée :
cat test.txt | sed 's/hello/goodbye/g'Exercice
Pour créer vos comptes sur mon serveur, j'ai du lire un fichier contenant vos adresses email, et :
Les filtrer : seulement les adresses e-mail valables sont prises. Les lignes vides ou les e-mails non-valables sont ignorés
Les transformer :
enlever du blanc avant et après l'adresse
convertir le texte en miniscule uniquement
remplacer l'arobase
@par un point.
Un exemple d'un fichier de ce type se trouve dans email-dirty.txt.
Construisez, en une ligne, un enchaînement de commandes qui traite ce fichier et qui sort sur stdout la liste d'emails propres.
Astuce : consulter les mots-clés spéciaux de la norme POSIX. Vous pouvez aussi chercher sur Google !
Solution
sed 's/[[:blank:]]//g': enlever tous les blancs du fluxsed '/^$/d': enlever les lignes vides (rien entre le début^et la fin$)grep -P "^[\w\d\.]+@[\w\d\.]+": filtrer uniquement les adresses e-mail valablessed 's/[[:upper:]]/\L&/g': convertir les majuscules en minisculesed 's/@/\./g': remplacer le @ par .
Mis à jour
Comment supprimer les lignes contenant une instance de texte ?
Utiliser l'instruction `d` (delete)