Sed, c'est bien

Sed est une commande très pratique mais très mla connue. elle est souvent utilisée comme un moteur d'expressions régulières simple pour modifier une ligne, mais en réalité, sed est bien plus que ça !

Une excellent article:

Ersatz de grep

On peut, grace à elle, se passer de l'utilisation de grep. En effet, si un script shell, plutot conséquent, exécute plusieur milliers de fois des commande de type 'grep | sed' dans une boucle, le shell forkera une fois par commande. Si on peut se passer de l'utilisation de grep, on gagne beaucoup de temps (le fork est tres lourd).

Un exemple concret:

On veut recupérer la liste des smileys de toto. on pourrais facilement faire grep 'toto' | sed -e 's/toto //'. Avec sed, on peut ecrire ceci:

cat <<EOF | sed -e 's/toto //; t; d'
toto :-)
tata :-(
toto 8-)
EOF

Juste pour faire comme grep

Pour émuler un simple grep 'toto':

cat <<EOF | sed -n '/toto/p'
toto :-)
tata :-(
toto 8-)
EOF

Explications:

la commande 's///' effectue un remplacement, en l'occurance, je remplace 'toto ' par rien. la commande 't' effectue un saut conditionnel. Si la commande 's///' matche, t saute à la fin des commandes et affiche le resultat. la commande 'd' efface le resultat et demarre le cycle suivant. Donc, si la commande 's///' échoue, on n'afiche pas le résultat et on traite la ligne suivante.

Joindre des entrées de lignes n à n

Exemple

Un exemple sera bien plus parlant que de longues explications. On a, par exemple, un fichier contenant les données suivantes:

Attribut
Valeur
Age
28ans
Ville
Perpignan
Pays
France
Ecran
Couleur

Pour des raisons pratiques, on souhaiterai avoir la liste sous ce format:

Attribut: Valeur
Age: 28ans
Ville: Perpignan
Pays: France
Ecran: Couleur

La commande est la suivante:

sed -e 'N; s/\n/: /g'

Explications:

Le 'N' ajoute la prochaine ligne à traiter à l'espace de traitement existant, la substitution remplace le saut de ligne entre les deux mots et le remplace par un ': '