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 ?

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Répondre à