[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: sed: remplacer les dernieres lignes de fichiers par un mot...



Jacques L'helgoualc'h a écrit :
Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
njko a écrit :
[...]
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Directement, tu ne peux pas.

Mécréant ! Sed est Turing-complet, il /peut/ le faire :

~ $ echo {1..12} | sed 's/ /\n/g' | \
sed -nre 'H;${g;s/(\n[^\n]*){0,25}$/\nIN MEMORIAM MAXI 25 LIGNES, AMEN/;s/^\n//p}'
IN MEMORIAM MAXI 25 LIGNES, AMEN

Évidemment, mais là tu charge tout dans le holdspace et tu appliques une regex dessus, ça sort du concept "stream editor" (mais c'est possible), dans la mesure où tu dois attendre d'avoir atteint la fin du fichier (en ayant tout chargé en attendant) pour commencer à travailler. Sur un petit fichier ça va, sur un log de qq centaines de Mo c'est moins top ;-)

Bref, je pense que wc + head reste le plus adapté à ce cas de figure.

--
Daniel


PS: pour ceux qui veulent comprendre, un peu d'explications sur l'expression sed de Jacques (un script sed s'applique sur chaque ligne en entrée)
<script sed>
H; # ajouter la ligne courante au holdspace (mémoire tampon)
${ # si on est sur la dernière ligne, on exécute ce bloc
  # récupérer le contenu du holdspace
  g;
  # remplacer la plus grande séquence constituée de 0 à 25 lignes se terminant par la fin de fichier
  # par le texte IN MEMORIAM... (1re expression s/pattern/replace/
  # remplacer les retour chariot en début de ligne par rien et imprimer le résultat de cette substitution
  s/(\n[^\n]*){0,25}$/\nIN MEMORIAM MAXI 25 LIGNES, AMEN/;s/^\n//p
}
</script sed>

les options sed sont
-n : n'imprimer les lignes reçues en entrée que si on le demande explicitement (avec p)
-r : il s'agit de regex étendues
-e : appliquer l'expression qui suit (entre apostrophes, pour que le shell n'interprête pas les $)

Je comprend d'ailleurs pas trop ce s/^\n//p, un
sed -nre 'H;${g;s/(\n[^\n]*){0,25}$/\nIN MEMORIAM MAXI 25 LIGNES, AMEN/p;}'
revient au même non ?


Reply to: