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 :

  • toutes les lignes
  • num : la ligne num (la dernière ligne est référencée par $)
  • num1,num2 : les lignes entre les lignes num1 et num2
  • RE : les lignes correspondant à l'expression régulière RE
  • RE1,RE2 : les lignes entre la première ligne correspondant à l'expression régulièreRE1 et la première ligne correspondant à l'expression régulière RE2

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

  • g : global, c'est à dire toutes les occurences de la chaine RE (par defaut seule la première occurence est remplacée)
  • p : imprime la ligne (utile avec l'option -n)
  • w fichier : ecrit la ligne dans le fichier specifié en plus de la sortie standard.

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
shell_awksed.txt · Last modified: 2012/05/21 14:17 (external edit)
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki