Modifications des lignes d'un fichier : sed

Navigation rapide : Lundi / Mardi / Mercredi / Jeudi / Vendredi

La commande sed permet d'appliquer un certain nombre de commandes sur un fichier puis d'en afficher le resultat (sans modification du fichier de départ) sur la sortie standard. Son utilisation se rapproche des compmandes de l'editeur ed.

sed [-n] [-e commande] [-f fichier de commandes] [fichier]

-n : écrit seulement les lignes spécifiées (par l'option /p) sur la sortie standard

-e : permet de specifier les commandes à appliquer sur le fichier. Cette option est utile lorque vous appliquez plusieurs commandes. Afin d'eviter que le shell interprette certains caracteres, il faut mieux encadrer la commande avec des ' ou des ” .

-f : les commandes sont lu à partir d'un fichier.

Pour chaque ligne , on applique la commande (si cela est possible) puis on affiche sur la sortie standard la ligne modifiée ou non.

la syntaxe générale des commandes est de la forme caracterisation_des_adresses commandes avec caractérisation_des_adresses de la forme :

La commande de substitution s : ad1,ad2s/RE/remplacement/flags

commande de remplacement y : ad1,ad2 y/C1/C2/ remplace le caractere de C1 par le caractere de C2

Commande de destruction d : sed “^$/d” détruit les lignes vides

Commande d'ajout a, d'insertion i, de remplacement de ligne c….

-ecrire toutes les apparition de computer dans fichier en majuscules

réponse

1: sed "s/[Cc][Oo][Mm][Pp][Uu][Tt][Ee][Rr]/COMPUTER/g" fichier

-encadre le premier nombre de la ligne avec des '\*\*'

réponse

1: sed -e "s/\([0-9][0-9]*\)/**\1**/" fichier

foo bar oni

eeny meeny miny

larry curly moe

jimmy the weasel

sed -e 's/\(.*\) \(.*\) \(.*\)/Victor \1-\2 Von \3/' myfile.txt

Victor foo-bar Von oni

Victor eeny-meeny Von miny

Victor larry-curly Von moe

Victor jimmy-the Von weasel

Modifications des lignes d'un fichier : awk

Comme sed, awk permet d'éditer un fichier texte mais embarque un langage de programmation plus complet.

Par exemple, à partir du fichier ci-dessous, qui représente un tableau, nous souhaitons ajouter une colonne nommée uid avec un nombre commençant à 1000 et incrémenté à chaque ligne.

^ Nom ^ Prénom ^ Login ^ Email ^
| Térieur | Alain | aterieu | aterieu@exemple.com |
| Hate | Tom | thate | thate@exemple.com |
| Aterre | Vac | vater | vater@exemple.com |
| Darque | Jeanne | jdarque | jdarque@exemple.com |

bash

1:  awk -v UIDMIN=1000 -F '|' 'BEGIN { idx=UIDMIN ; print "^ Nom ^ Prénom ^ Login ^ Uid ^ Email ^" } /^\|/ {printf("|%s|%s|%s|%s|%s|\n",$2,$3,$4,idx++,$5) ; } END { printf("%s lignes\n",idx); }' table.wiki

Pour obtenir quelquechose de plus lisible, il est intéressant de placer le programme awk dans un fichier séparé.

BEGIN {
  idx=UIDMIN ;
  print "^ Nom ^ Prénom ^ Login ^ Uid ^ Email ^"
}

/^\|/ {
  printf("|%s|%s|%s|%s|%s|\n",$2,$3,$4,idx++,$5) ;
}

END {
  printf("%s lignes\n",idx);
}

En plaçant cela dans prog.awk, nous l'invoquons avec la commande :

awk -v UIDMIN=1000 -F '|' -f prog.awk table.wiki