supprimer blic de ligne + ligne vide pr
Le
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.
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.
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
Le 10/12/2013 23:14, Christophe PEREZ 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. ;-)
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.
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
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
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.
Ça, je m'en suis rendu compte :D
C'est méchant ! J'ai cru que tu étais sérieux :)
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'
Je vais voir comment je peux adapter, mais vu la complexité du truc, j'ai
comme un gros doute :D
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.
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
Pas bête, mais est-ce que ça ne risque pas de bouffer le dernier n
si le bloc cherché est à la fin ?
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.
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 :(