Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

supprimer blic de ligne + ligne vide pr

14 réponses
Avatar
Christophe PEREZ
Bonjour,

Mon problème est sans doute tout bête pour qui maîtrise, mais moi, je ne
trouve pas.

Avec sed, je cherche à supprimer un bloc de ligne dans un fichier texte
(ça je sais faire) mais aussi à supprimer la ligne vide qui le précède
forcément. Et là, je ne trouve pas...

Ex :
1. ligne 1
2. ligne 2
3.
4. ligne 4
5. ligne 5
6. ligne 6
7.
8. ligne 7

Je veux supprimer de la ligne 4 à la ligne 6 (sans les désigner par leur
numéro de ligne), mais aussi la ligne 3 avec.

(je me demande si je suis très clair).

Je continue mes recherches, mais si un passant connait la solution ;)

Merci d'avance.

10 réponses

1 2
Avatar
Olivier Miakinen
Le 10/12/2013 23:14, Christophe PEREZ a écrit :

Avec sed, je cherche à supprimer un bloc de ligne dans un fichier texte
(ça je sais faire) mais aussi à supprimer la ligne vide qui le précède
forcément. Et là, je ne trouve pas...

Ex :
1. ligne 1
2. ligne 2
3.
4. ligne 4
5. ligne 5
6. ligne 6
7.
8. ligne 7

Je veux supprimer de la ligne 4 à la ligne 6 (sans les désigner par leur
numéro de ligne), mais aussi la ligne 3 avec.



Je ne sais pas le faire avec sed, mais avec ed dans un shell script :

ed monfichier <<FOOBAR
/ligne 4/-1,/ligne 6/d
wq
FOOBAR

Bien entendu, tu peux le faire aussi en interactif :

ed monfichier
/ligne 4/-1,/ligne 6/d
wq
Avatar
Francois Lafont
Salut,

Le 10/12/2013 23:14, Christophe PEREZ a écrit :

Mon problème est sans doute tout bête pour qui maîtrise, mais moi, je ne
trouve pas.

Avec sed, je cherche à supprimer un bloc de ligne dans un fichier texte
(ça je sais faire) mais aussi à supprimer la ligne vide qui le précède
forcément. Et là, je ne trouve pas...



Ben, avec ton éditeur (nano par exemple), tu effaces les lignes que
tu souhaites dont la fameuse ligne vide, tout simplement (je crois que
sous nano c'est Ctrl+k pour effacer une ligne). C'est tout.

Voilà, ça c'était pour la petite blague de la soirée. ;-)

Ex :
1. ligne 1
2. ligne 2
3.
4. ligne 4
5. ligne 5
6. ligne 6
7.
8. ligne 7

Je veux supprimer de la ligne 4 à la ligne 6 (sans les désigner par leur
numéro de ligne), mais aussi la ligne 3 avec.

(je me demande si je suis très clair).



Quasiment. Tu ne précises pas comment est identifié ton bloc de lignes
(pas par les numéro de ligne, ok mais par quoi ?). Car la solution, je
pense, dépend fortement de cette caractéristique.

Je continue mes recherches, mais si un passant connait la solution ;)



Dans mon cas, je vais supposer que le bloc est l'ensemble de toutes les
lignes contenant la chaîne "toto" et je suppose, comme tu l'as bien
indiqué pour le coup, que ce bloc est forcément précédé d'une ligne
(vide ou pas ici ça ne change rien). Dans ce cas, il me semble que ceci
marche (pas sûr à 100% tellement c'est moche) :

sed -r -n
-e '1h'
-e '1!{H;x;/toto/!{s/^(.*)n.*$/1/p}}'
-e '${/toto/!{x;p}}' fichier

Si c'est pas clair, reviens à la charge. L'idée est de jouer avec le
hold space pour stocker la ligne courante (ligne n) mais aussi la
ligne qui précède (ligne n-1) et d'arriver à décider s'il faut afficher
ou non la ligne n-1.

Je pense que sed n'est vraiment pas l'idéal pour faire ça. Je n'ai pas
réfléchi à la question mais peut-être que ça serait plus facile à écrire
avec awk. Avis aux amateurs... ;-)

--
François Lafont
Avatar
Marc Boyer
Le 10-12-2013, Christophe PEREZ a écrit :
Avec sed, je cherche à supprimer un bloc de ligne dans un fichier texte
(ça je sais faire) mais aussi à supprimer la ligne vide qui le précède
forcément. Et là, je ne trouve pas...

Ex :
1. ligne 1
2. ligne 2
3.
4. ligne 4
5. ligne 5
6. ligne 6
7.
8. ligne 7

Je veux supprimer de la ligne 4 à la ligne 6 (sans les désigner par leur
numéro de ligne), mais aussi la ligne 3 avec.



Pourquoi ne pas laisser la 3 et détruire la 7 ?

Après, c'est toujours pénible de revenir "en arrière" dans un éditeur
de flux type sed/awk...

Soit on stoque toujours la ligne précédente, soit on fait deux passes.

Marc Boyer
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Christophe PEREZ
Le Wed, 11 Dec 2013 08:40:02 +0000, Marc Boyer a écrit :

Pourquoi ne pas laisser la 3 et détruire la 7 ?



Parce que mon exemple est très mal choisi, et que le bloc peut se situer
en fin de fichier, mais à priori pas au début.

Après, c'est toujours pénible de revenir "en arrière" dans un éditeur de
flux type sed/awk...



Ça, je m'en suis rendu compte :D
Avatar
Christophe PEREZ
Le Wed, 11 Dec 2013 02:20:20 +0100, Francois Lafont a écrit :

Ben, avec ton éditeur (nano par exemple), tu effaces les lignes que tu
souhaites dont la fameuse ligne vide, tout simplement (je crois que sous
nano c'est Ctrl+k pour effacer une ligne). C'est tout.

Voilà, ça c'était pour la petite blague de la soirée. ;-)



C'est méchant ! J'ai cru que tu étais sérieux :)

Quasiment. Tu ne précises pas comment est identifié ton bloc de lignes
(pas par les numéro de ligne, ok mais par quoi ?). Car la solution, je
pense, dépend fortement de cette caractéristique.



Evidemment. Et le pire c'est que j'avais prévu de le préciser, et j'ai
oublié.
En fait, je sélectionne mon bloc de ligne par le motif de la première à
la dernière, genre : '/ligne 4/,/ligne 6/d'

sed -r -n
-e '1h'
-e '1!{H;x;/toto/!{s/^(.*)n.*$/1/p}}'
-e '${/toto/!{x;p}}' fichier



Je vais voir comment je peux adapter, mais vu la complexité du truc, j'ai
comme un gros doute :D
Avatar
Christophe PEREZ
Le Wed, 11 Dec 2013 00:21:53 +0100, Olivier Miakinen a écrit :

Je ne sais pas le faire avec sed, mais avec ed dans un shell script :

ed monfichier <<FOOBAR /ligne 4/-1,/ligne 6/d wq FOOBAR

Bien entendu, tu peux le faire aussi en interactif :

ed monfichier /ligne 4/-1,/ligne 6/d wq



Et bien en fait, j'ai commis une autre grosse erreur que de vous imposer
l'outil alors que ça m'est complètement égal d'utiliser autre chose.
C'est juste que je connais un peu sed, et pas bcp le reste... donc pour
adapter c'est forcément à priori plus simple.
Je vais voir ce que me donne ta solution.

Merci à tous les 3 pour votre aide.
Avatar
Marc Boyer
Le 10-12-2013, Christophe PEREZ a écrit :
Avec sed, je cherche à supprimer un bloc de ligne dans un fichier texte
(ça je sais faire) mais aussi à supprimer la ligne vide qui le précède
forcément. Et là, je ne trouve pas...

Ex :
1. ligne 1
2. ligne 2
3.
4. ligne 4
5. ligne 5
6. ligne 6
7.
8. ligne 7



Sinon, une solution avec awk, c'est de considérer la ligne vide comme
délimiteur de bloc, et la fin de ligne comme délimiteur de champs.

On lit ainsi bloc par bloc, plutot que ligne par ligne.

A voir si ça s'adapte au problème réel.

awk -v RS='nn' -v FS='n' '{if ($1 !~ /ligne 4/) print $0;}' toto.txt
--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet
Avatar
Olivier Miakinen
Le 12/12/2013 10:30, Marc Boyer a écrit :

Sinon, une solution avec awk, c'est de considérer la ligne vide comme
délimiteur de bloc, et la fin de ligne comme délimiteur de champs.

On lit ainsi bloc par bloc, plutot que ligne par ligne.

A voir si ça s'adapte au problème réel.

awk -v RS='nn' -v FS='n' '{if ($1 !~ /ligne 4/) print $0;}' toto.txt



Pas bête, mais est-ce que ça ne risque pas de bouffer le dernier n
si le bloc cherché est à la fin ?
Avatar
Christophe PEREZ
Le Thu, 12 Dec 2013 09:30:27 +0000, Marc Boyer a écrit :

awk -v RS='nn' -v FS='n' '{if ($1 !~ /ligne 4/) print $0;}' toto.txt



Donc /ligne 6/ et non pas /ligne 4/ non ?

De toute les façons, ça ne semble pas faire ce qu'il faut avec l'un comme
avec l'autre.

Je suis pour l'instant resté à la solution "ed" (qu'il m'a fallu rajouter
à mon système).

J'ai répondu à chacun de vous, mais bizarrement, mon pan ne me donne pas
mes propres réponses. Pourtant elles sont sur mon serveur inn, et je les
voit dans google groups. Sans doute une conséquence du récent passage à
Gnome 3.8 et d'un nouveau pan.
Mais du coup, ça m'incite peu à vous répondre. Faut que je fasse des
tests pour savoir d'où ça vient, et éventuellement venir requérir votre
aide encore.
Avatar
Christophe PEREZ
Le Thu, 12 Dec 2013 14:10:32 +0000, Christophe PEREZ a écrit :

Sans doute une conséquence du récent passage à Gnome 3.8 et d'un nouveau
pan.



Je confirme, le retour de net-nntp/pan-0.139 à net-nntp/pan-0.135 ne
présente plus le problème.
Cependant, j'ai du mal à comprendre pourquoi seuls mes propres messages
sont squizzés comme ça. Peut-être un rapport avec l'encodage ou un truc
du genre. Pas trop le temps de chercher plus, j'ai un pb avec le nfs de
mon serveur :(
1 2