Bonjour à tous,
Tout est dans le titre. J'entends par ligne « vide » une ligne qui correspond à la regex /^[[:space:]]*$/. J'aimerais bien si possible me limiter à du sed par exemple ou éventuellement à du awk.
Je précise que :
sed '/^[[:space:]]*$/d' mon-fichier.txt
ne me convient pas car il supprime *toutes* les lignes vides du fichier, or je voudrais seulement supprimer les *dernières* lignes vides du fichier. C'est ce point là sur lequel je bloque et qui fait que je viens poster ici.
Merci d'avance.
Bonjour à tous,
Tout est dans le titre. J'entends par ligne « vide » une ligne qui correspond à la regex /^[[:space:]]*$/. J'aimerais bien si possible me limiter à du sed par exemple ou éventuellement à du awk.
Je précise que :
sed '/^[[:space:]]*$/d' mon-fichier.txt
ne me convient pas car il supprime *toutes* les lignes vides du fichier, or je voudrais seulement supprimer les *dernières* lignes vides du fichier. C'est ce point là sur lequel je bloque et qui fait que je viens poster ici.
Merci d'avance.
Bonjour à tous,
Tout est dans le titre. J'entends par ligne « vide » une ligne qui correspond à la regex /^[[:space:]]*$/. J'aimerais bien si possible me limiter à du sed par exemple ou éventuellement à du awk.
Je précise que :
sed '/^[[:space:]]*$/d' mon-fichier.txt
ne me convient pas car il supprime *toutes* les lignes vides du fichier, or je voudrais seulement supprimer les *dernières* lignes vides du fichier. C'est ce point là sur lequel je bloque et qui fait que je viens poster ici.
Merci d'avance.
Tout est dans le titre. J'entends par ligne « vide » une ligne qui
correspond à la regex /^[[:space:]]*$/. J'aimerais bien si possible me
limiter à du sed par exemple ou éventuellement à du awk.
Je précise que :
sed '/^[[:space:]]*$/d' mon-fichier.txt
ne me convient pas car il supprime *toutes* les lignes vides du
fichier, or je voudrais seulement supprimer les *dernières* lignes
vides du fichier. C'est ce point là sur lequel je bloque et qui fait
que je viens poster ici.
Tout est dans le titre. J'entends par ligne « vide » une ligne qui
correspond à la regex /^[[:space:]]*$/. J'aimerais bien si possible me
limiter à du sed par exemple ou éventuellement à du awk.
Je précise que :
sed '/^[[:space:]]*$/d' mon-fichier.txt
ne me convient pas car il supprime *toutes* les lignes vides du
fichier, or je voudrais seulement supprimer les *dernières* lignes
vides du fichier. C'est ce point là sur lequel je bloque et qui fait
que je viens poster ici.
Tout est dans le titre. J'entends par ligne « vide » une ligne qui
correspond à la regex /^[[:space:]]*$/. J'aimerais bien si possible me
limiter à du sed par exemple ou éventuellement à du awk.
Je précise que :
sed '/^[[:space:]]*$/d' mon-fichier.txt
ne me convient pas car il supprime *toutes* les lignes vides du
fichier, or je voudrais seulement supprimer les *dernières* lignes
vides du fichier. C'est ce point là sur lequel je bloque et qui fait
que je viens poster ici.
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
1h;1!H ajoute le contenu de mon fichier dans le buffer additionnel
${...} le bloc ne sera exécuté que pour la dernière ligne
x échange le buffer additionnel et le buffer principal
s/[[:space:]]*$// supprime tout les espaces consécutifs à la fin du
fichier
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
1h;1!H ajoute le contenu de mon fichier dans le buffer additionnel
${...} le bloc ne sera exécuté que pour la dernière ligne
x échange le buffer additionnel et le buffer principal
s/[[:space:]]*$// supprime tout les espaces consécutifs à la fin du
fichier
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
1h;1!H ajoute le contenu de mon fichier dans le buffer additionnel
${...} le bloc ne sera exécuté que pour la dernière ligne
x échange le buffer additionnel et le buffer principal
s/[[:space:]]*$// supprime tout les espaces consécutifs à la fin du
fichier
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
Pas mal le coup du « tac-tac » (je ne connaissais pas cette commande).
Je pense avoir compris le principe mais il y a juste la syntaxe :
... | awk '...;a'
qui me gêne un peu. Quand a vaut 1, sauf erreur de ma part on a :
awk 'a' <=> awk '1' <=> awk '1 { print $0 }'
Et là j'aimerais bien avoir une explication. En effet, je connais le
classique « /regex/ { ... } », mais mettre juste 1 à la place de la
regex je ne vois pas trop.
Ça serait un peu comme dans certain langage, 1 est évalué comme
différent de 0 et le test est positif (et donc on affiche) ? Et si
a n'est pas définie, comme c'est le cas au début quand awk lit des
lignes vides, alors a est évalué comme étant égal à une chaîne vide
qui est évaluée à 0 et donc le test est négatif ? C'est un truc dans
le genre ?
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
La vache, au départ ça pique les yeux ! :-)1h;1!H ajoute le contenu de mon fichier dans le buffer additionnel
Ok, après avoir consulté Google, j'ai compris que 1h met dans le hold
buffer (le buffer additionnel) la ligne 1 et ensuite, avec 1!H, pour
toutes les lignes sauf la ligne 1, on les *ajoute* (H) dans le hold
buffer. Une fois la dernière ligne lue par sed, le hold buffer
contient alors tout le fichier.
Question : au départ je me suis dit qu'on pouvait tout simplement
mettre « H » à la place de « 1h;1!H ». Mais ça n'est pas tout à fait
équivalent car je me retrouve avec une ligne vide ajoutée au tout
début de la sortie de sed. Pourquoi ?
${...} le bloc ne sera exécuté que pour la dernière ligne
Ok et à ce moment là le hold buffer contient tout le fichier.x échange le buffer additionnel et le buffer principal
Ok.s/[[:space:]]*$// supprime tout les espaces consécutifs à la fin du
fichier
Et là je coince un peu. Normalement sed fonctionne ligne par ligne et
là, sauf erreur de ma part, tout se passe comme si ton buffer
principal était en un seul morceau (alors qu'il est bien constitué de
plusieurs lignes) et comme si « [[:space:]]*$ » matchait les blancs
avec les sauts de ligne compris.
1. Déjà, [[:space:]] ça matche aussi les sauts de lignes (autrement
dit les sauts de lignes font partie des blancs) ?
2. Comment se fait-il que sed voit son buffer principal en un seul
morceau alors que ce morceau fait plusieurs lignes ? Je pensais que
sed fonctionnait ligne par ligne ?
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
Pas mal le coup du « tac-tac » (je ne connaissais pas cette commande).
Je pense avoir compris le principe mais il y a juste la syntaxe :
... | awk '...;a'
qui me gêne un peu. Quand a vaut 1, sauf erreur de ma part on a :
awk 'a' <=> awk '1' <=> awk '1 { print $0 }'
Et là j'aimerais bien avoir une explication. En effet, je connais le
classique « /regex/ { ... } », mais mettre juste 1 à la place de la
regex je ne vois pas trop.
Ça serait un peu comme dans certain langage, 1 est évalué comme
différent de 0 et le test est positif (et donc on affiche) ? Et si
a n'est pas définie, comme c'est le cas au début quand awk lit des
lignes vides, alors a est évalué comme étant égal à une chaîne vide
qui est évaluée à 0 et donc le test est négatif ? C'est un truc dans
le genre ?
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
La vache, au départ ça pique les yeux ! :-)
1h;1!H ajoute le contenu de mon fichier dans le buffer additionnel
Ok, après avoir consulté Google, j'ai compris que 1h met dans le hold
buffer (le buffer additionnel) la ligne 1 et ensuite, avec 1!H, pour
toutes les lignes sauf la ligne 1, on les *ajoute* (H) dans le hold
buffer. Une fois la dernière ligne lue par sed, le hold buffer
contient alors tout le fichier.
Question : au départ je me suis dit qu'on pouvait tout simplement
mettre « H » à la place de « 1h;1!H ». Mais ça n'est pas tout à fait
équivalent car je me retrouve avec une ligne vide ajoutée au tout
début de la sortie de sed. Pourquoi ?
${...} le bloc ne sera exécuté que pour la dernière ligne
Ok et à ce moment là le hold buffer contient tout le fichier.
x échange le buffer additionnel et le buffer principal
Ok.
s/[[:space:]]*$// supprime tout les espaces consécutifs à la fin du
fichier
Et là je coince un peu. Normalement sed fonctionne ligne par ligne et
là, sauf erreur de ma part, tout se passe comme si ton buffer
principal était en un seul morceau (alors qu'il est bien constitué de
plusieurs lignes) et comme si « [[:space:]]*$ » matchait les blancs
avec les sauts de ligne compris.
1. Déjà, [[:space:]] ça matche aussi les sauts de lignes (autrement
dit les sauts de lignes font partie des blancs) ?
2. Comment se fait-il que sed voit son buffer principal en un seul
morceau alors que ce morceau fait plusieurs lignes ? Je pensais que
sed fonctionnait ligne par ligne ?
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
Pas mal le coup du « tac-tac » (je ne connaissais pas cette commande).
Je pense avoir compris le principe mais il y a juste la syntaxe :
... | awk '...;a'
qui me gêne un peu. Quand a vaut 1, sauf erreur de ma part on a :
awk 'a' <=> awk '1' <=> awk '1 { print $0 }'
Et là j'aimerais bien avoir une explication. En effet, je connais le
classique « /regex/ { ... } », mais mettre juste 1 à la place de la
regex je ne vois pas trop.
Ça serait un peu comme dans certain langage, 1 est évalué comme
différent de 0 et le test est positif (et donc on affiche) ? Et si
a n'est pas définie, comme c'est le cas au début quand awk lit des
lignes vides, alors a est évalué comme étant égal à une chaîne vide
qui est évaluée à 0 et donc le test est négatif ? C'est un truc dans
le genre ?
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
La vache, au départ ça pique les yeux ! :-)1h;1!H ajoute le contenu de mon fichier dans le buffer additionnel
Ok, après avoir consulté Google, j'ai compris que 1h met dans le hold
buffer (le buffer additionnel) la ligne 1 et ensuite, avec 1!H, pour
toutes les lignes sauf la ligne 1, on les *ajoute* (H) dans le hold
buffer. Une fois la dernière ligne lue par sed, le hold buffer
contient alors tout le fichier.
Question : au départ je me suis dit qu'on pouvait tout simplement
mettre « H » à la place de « 1h;1!H ». Mais ça n'est pas tout à fait
équivalent car je me retrouve avec une ligne vide ajoutée au tout
début de la sortie de sed. Pourquoi ?
${...} le bloc ne sera exécuté que pour la dernière ligne
Ok et à ce moment là le hold buffer contient tout le fichier.x échange le buffer additionnel et le buffer principal
Ok.s/[[:space:]]*$// supprime tout les espaces consécutifs à la fin du
fichier
Et là je coince un peu. Normalement sed fonctionne ligne par ligne et
là, sauf erreur de ma part, tout se passe comme si ton buffer
principal était en un seul morceau (alors qu'il est bien constitué de
plusieurs lignes) et comme si « [[:space:]]*$ » matchait les blancs
avec les sauts de ligne compris.
1. Déjà, [[:space:]] ça matche aussi les sauts de lignes (autrement
dit les sauts de lignes font partie des blancs) ?
2. Comment se fait-il que sed voit son buffer principal en un seul
morceau alors que ce morceau fait plusieurs lignes ? Je pensais que
sed fonctionnait ligne par ligne ?
Salut,
Déjà, merci à tous les deux pour vos réponses, toutes les deux super efficaces. J'aurais bien voulu avoir quelques précisions si c'est possible.
Loki a écrit :$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
Pas mal le coup du « tac-tac » (je ne connaissais pas cette commande). Je pense avoir compris le principe mais il y a juste la syntaxe :
... | awk '...;a'
qui me gêne un peu. Quand a vaut 1, sauf erreur de ma part on a :
awk 'a' <=> awk '1' <=> awk '1 { print $0 }'
Et là j'aimerais bien avoir une explication. En effet,
je connais le classique « /regex/ { ... } », mais mettre juste 1 à la
place de la regex je ne vois pas trop.
Ça serait un peu comme dans certain langage, 1 est évalué comme différent de 0 et
le test est positif (et donc on affiche) ?
Et si a n'est pas définie, comme c'est le cas au début quand awk lit des
lignes vides, alors a est évalué comme étant égal à une chaîne vide qui est
évaluée à 0 et donc le test est négatif ? C'est un truc dans le genre ?
Benoît a écrit :sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
La vache, au départ ça pique les yeux ! :-)
Salut,
Déjà, merci à tous les deux pour vos réponses, toutes les deux super efficaces. J'aurais bien voulu avoir quelques précisions si c'est possible.
Loki a écrit :
$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
Pas mal le coup du « tac-tac » (je ne connaissais pas cette commande). Je pense avoir compris le principe mais il y a juste la syntaxe :
... | awk '...;a'
qui me gêne un peu. Quand a vaut 1, sauf erreur de ma part on a :
awk 'a' <=> awk '1' <=> awk '1 { print $0 }'
Et là j'aimerais bien avoir une explication. En effet,
je connais le classique « /regex/ { ... } », mais mettre juste 1 à la
place de la regex je ne vois pas trop.
Ça serait un peu comme dans certain langage, 1 est évalué comme différent de 0 et
le test est positif (et donc on affiche) ?
Et si a n'est pas définie, comme c'est le cas au début quand awk lit des
lignes vides, alors a est évalué comme étant égal à une chaîne vide qui est
évaluée à 0 et donc le test est négatif ? C'est un truc dans le genre ?
Benoît a écrit :
sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
La vache, au départ ça pique les yeux ! :-)
Salut,
Déjà, merci à tous les deux pour vos réponses, toutes les deux super efficaces. J'aurais bien voulu avoir quelques précisions si c'est possible.
Loki a écrit :$ tac ton-fichier.txt | awk '!/^[[:space:]]*$/{a=1}; a' | tac
Pas mal le coup du « tac-tac » (je ne connaissais pas cette commande). Je pense avoir compris le principe mais il y a juste la syntaxe :
... | awk '...;a'
qui me gêne un peu. Quand a vaut 1, sauf erreur de ma part on a :
awk 'a' <=> awk '1' <=> awk '1 { print $0 }'
Et là j'aimerais bien avoir une explication. En effet,
je connais le classique « /regex/ { ... } », mais mettre juste 1 à la
place de la regex je ne vois pas trop.
Ça serait un peu comme dans certain langage, 1 est évalué comme différent de 0 et
le test est positif (et donc on affiche) ?
Et si a n'est pas définie, comme c'est le cas au début quand awk lit des
lignes vides, alors a est évalué comme étant égal à une chaîne vide qui est
évaluée à 0 et donc le test est négatif ? C'est un truc dans le genre ?
Benoît a écrit :sed -n '1h;1!H;${x;s/[[:space:]]*$//;p}' mon-fichier.txt
La vache, au départ ça pique les yeux ! :-)