Salut la liste!
Un petit message car je galère avec sed....
Je souhaiterais supprimer les 25 dernières lignes de plusieurs fichiers,
et y mettre à la place un simple mot.
D'apres ce que j'ai compris de la doc, j'ai tenté quelques commandes,
jamais bon.
sed -i -e "s/$-25/nouveaumot/g" *.php
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Quelqun-e aurait une piste?
Salut la liste!
Un petit message car je galère avec sed....
Je souhaiterais supprimer les 25 dernières lignes de plusieurs fichiers,
et y mettre à la place un simple mot.
D'apres ce que j'ai compris de la doc, j'ai tenté quelques commandes,
jamais bon.
sed -i -e "s/$-25/nouveaumot/g" *.php
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Quelqun-e aurait une piste?
Salut la liste!
Un petit message car je galère avec sed....
Je souhaiterais supprimer les 25 dernières lignes de plusieurs fichiers,
et y mettre à la place un simple mot.
D'apres ce que j'ai compris de la doc, j'ai tenté quelques commandes,
jamais bon.
sed -i -e "s/$-25/nouveaumot/g" *.php
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Quelqun-e aurait une piste?
Salut la liste!
Un petit message car je galère avec sed....
Je souhaiterais supprimer les 25 dernières lignes de plusieurs fichiers,
et y mettre à la place un simple mot.
D'apres ce que j'ai compris de la doc, j'ai tenté quelques commandes,
jamais bon.
sed -i -e "s/$-25/nouveaumot/g" *.php
par exemple.. me rajoute un nouveaumot à chaque ligne.
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Quelqun-e aurait une piste?
Merci et bonne continuation!
Salut la liste!
Un petit message car je galère avec sed....
Je souhaiterais supprimer les 25 dernières lignes de plusieurs fichiers,
et y mettre à la place un simple mot.
D'apres ce que j'ai compris de la doc, j'ai tenté quelques commandes,
jamais bon.
sed -i -e "s/$-25/nouveaumot/g" *.php
par exemple.. me rajoute un nouveaumot à chaque ligne.
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Quelqun-e aurait une piste?
Merci et bonne continuation!
Salut la liste!
Un petit message car je galère avec sed....
Je souhaiterais supprimer les 25 dernières lignes de plusieurs fichiers,
et y mettre à la place un simple mot.
D'apres ce que j'ai compris de la doc, j'ai tenté quelques commandes,
jamais bon.
sed -i -e "s/$-25/nouveaumot/g" *.php
par exemple.. me rajoute un nouveaumot à chaque ligne.
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Quelqun-e aurait une piste?
Merci et bonne continuation!
njko a écrit :
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Directement, tu ne peux pas.
njko a écrit :
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Directement, tu ne peux pas.
njko a écrit :
Comment dire à sed de remplacer les n dernieres lignes de différents
fichiers par un mot?
Directement, tu ne peux pas.
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
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
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
Jacques L'helgoualc'h a écrit :Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :njko a écrit :
Jacques L'helgoualc'h a écrit :
Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
njko a écrit :
Jacques L'helgoualc'h a écrit :Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :njko a écrit :
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.
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/
s/(n[^n]*){0,25}$/nIN MEMORIAM MAXI 25 LIGNES, AMEN/
}
</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 ?
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.
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/
s/(n[^n]*){0,25}$/nIN MEMORIAM MAXI 25 LIGNES, AMEN/
}
</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 ?
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.
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/
s/(n[^n]*){0,25}$/nIN MEMORIAM MAXI 25 LIGNES, AMEN/
}
</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 ?
Le 23 décembre 2008 17:05, Daniel Caillibaud a écrit
:
> Jacques L'helgoualc'h a écrit :
>
>> Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
>>
>>> njko a écrit :
>>>
>>
Juste parce que ça m'amusait de le faire en perl :
$ perl -e 'while(<>){$i++;push(@buf,$_);print shift(@buf) if($i>25);}'
lefichier
J'écoute toute améliorations bien sûr ;)
Le 23 décembre 2008 17:05, Daniel Caillibaud <ml@editionsdidier.com> a écrit
:
> Jacques L'helgoualc'h a écrit :
>
>> Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
>>
>>> njko a écrit :
>>>
>>
Juste parce que ça m'amusait de le faire en perl :
$ perl -e 'while(<>){$i++;push(@buf,$_);print shift(@buf) if($i>25);}'
lefichier
J'écoute toute améliorations bien sûr ;)
Le 23 décembre 2008 17:05, Daniel Caillibaud a écrit
:
> Jacques L'helgoualc'h a écrit :
>
>> Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
>>
>>> njko a écrit :
>>>
>>
Juste parce que ça m'amusait de le faire en perl :
$ perl -e 'while(<>){$i++;push(@buf,$_);print shift(@buf) if($i>25);}'
lefichier
J'écoute toute améliorations bien sûr ;)
a écrit :
perl -e 'while(<>){,$_;print if++$i>25}print"Le mot de la
finn"'
a écrit :
perl -e 'while(<>){push@b,$_;print shift@b if++$i>25}print"Le mot de la
finn"'
a écrit :
perl -e 'while(<>){,$_;print if++$i>25}print"Le mot de la
finn"'
Kevin Hinault a écrit, mardi 23 décembre 2008, à 17:50 :Le 23 décembre 2008 17:05, Daniel Caillibaud a écrit
:
> Jacques L'helgoualc'h a écrit :
>
>> Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
>>
>>> njko a écrit :
>>>
>>
Juste parce que ça m'amusait de le faire en perl :
$ perl -e 'while(<>){$i++;push(@buf,$_);print shift(@buf) if($i>25);}'
lefichier
J'écoute toute améliorations bien sûr ;)
perl -e 'while(<>){,$_;print if++$i>25}print"Le mot de la f inn"'
Kevin Hinault a écrit, mardi 23 décembre 2008, à 17:50 :
Le 23 décembre 2008 17:05, Daniel Caillibaud <ml@editionsdidier.com> a écrit
:
> Jacques L'helgoualc'h a écrit :
>
>> Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
>>
>>> njko a écrit :
>>>
>>
Juste parce que ça m'amusait de le faire en perl :
$ perl -e 'while(<>){$i++;push(@buf,$_);print shift(@buf) if($i>25);}'
lefichier
J'écoute toute améliorations bien sûr ;)
perl -e 'while(<>){push@b,$_;print shift@b if++$i>25}print"Le mot de la f inn"'
Kevin Hinault a écrit, mardi 23 décembre 2008, à 17:50 :Le 23 décembre 2008 17:05, Daniel Caillibaud a écrit
:
> Jacques L'helgoualc'h a écrit :
>
>> Daniel Caillibaud a écrit, mardi 23 décembre 2008, à 10:15 :
>>
>>> njko a écrit :
>>>
>>
Juste parce que ça m'amusait de le faire en perl :
$ perl -e 'while(<>){$i++;push(@buf,$_);print shift(@buf) if($i>25);}'
lefichier
J'écoute toute améliorations bien sûr ;)
perl -e 'while(<>){,$_;print if++$i>25}print"Le mot de la f inn"'
Il me semble que dans les trésors de http://sed.sf.net on peut trouver
une méthode de fenêtre glissante FIFO qui permet, appliquée ici,
- de stocker les 25 premières lignes ;
- puis écrire la première, l'effacer et ajouter la nouvelle en queue ;
- et faire la substitution demandée, une fois avalée la dernière ligne...
Il me semble que dans les trésors de http://sed.sf.net on peut trouver
une méthode de fenêtre glissante FIFO qui permet, appliquée ici,
- de stocker les 25 premières lignes ;
- puis écrire la première, l'effacer et ajouter la nouvelle en queue ;
- et faire la substitution demandée, une fois avalée la dernière ligne...
Il me semble que dans les trésors de http://sed.sf.net on peut trouver
une méthode de fenêtre glissante FIFO qui permet, appliquée ici,
- de stocker les 25 premières lignes ;
- puis écrire la première, l'effacer et ajouter la nouvelle en queue ;
- et faire la substitution demandée, une fois avalée la dernière ligne...