-1
votes

Comment sélectionner des lignes entre deux motifs de marqueur pouvant survenir plusieurs fois avec AWK / SED et supprimer ces lignes

Supposons qu'un fichier contienne: xxx pré>

et le motif de démarrage est ABC et le motif de fin est MNO, j'ai besoin de la sortie comme suit: P>

def2
ghi2
jkl2


9 commentaires

La cinquième ligne est-elle une erreur? Si tel est le cas, un fichier simple sed '/ ^ ABC $ /, / ^ mno $ / d' fichier fonctionnera. Si non, expliquez pourquoi abc n'est pas en sortie


@Sundeep, monsieur si cela ne vous dérangeait pas que je ne disais que ce que je pense, la sortie vient comme déf2 ghi2 jkl2 car juste avant déf2 une occurrence de ABC Y a-t-il ce qui n'est pas fermé et encore un ABC est arrivé après elle, IMHO C'est pourquoi OP veut l'imprimer, mais OP ne pourrait confirmer cela.


Re " Tout entre ABC et MNO doit être supprimé ", les lignes que vous avez demandé à conserver sont entre abc et mno ...


Aucune ligne 5ème n'est pas une erreur. Je veux quelque chose après ABC, y compris ABC si cela n'est pas fini par MNO.


@Anupamdas, EAxclty, c'est ce que j'ai essayé d'expliquer ci-dessus. S'il vous plaît changer votre question et le rendre plus clair.


@ikegami non je veux des lignes entre ABC et MNO à enlever


déf2 , ghi2 et jkl2 entre abc et mno , mais vous avez dit que vous avez dit que vous avez dit voulait les garder


@ikegami, IMHO, quel op de dire son cycle (de abc à mno ) au cas où tout abc est suivi d'un autre ABC et MON Dans ce cycle est manquant à ce moment-là, ces éléments provenant de 2 ABC S doivent être imprimés.


@ Ravindersingh13, c'est la même vue que je prends. Il y a deux cycles et l'intégralité du fichier.


3 Réponses :


1
votes

Si vous divisez l'entrée sur ABC \ N CODE> Vous pouvez vous éloigner de supprimer ceux qui contiennent mno code>, par exemple. avec GNU AWK:

def2
ghi2
jkl2


3 commentaires

Ceci est une extension GNU awk. Dans POSIX AWK, la variable RS ne peut être qu'un seul caractère.


Cela échouera si mno apparaît avant le premier abc


@ Kvantour: J'ai explicitement mentionné GNU AWK et cela fonctionne avec l'exemple fourni par le PO, bien qu'il ne soit pas clair ce qu'il veut vraiment



0
votes

Ceci pourrait fonctionner pour vous (GNU SED):

sed -n '/abc/{:a;x;z;x;:b;n;/abc/{:c;g;s/.//p;ba};/mno/d;H;$bc;bb};p' file


0 commentaires

0
votes

Voici un moyen simple de le faire qui fonctionne avec n'importe quel AWK:

   from\to | begpat | endpat | END        BEGIN: BEGIN OF FILE
   --------+--------+--------+-----       END  : END OF FILE
    BEGIN  |   1    |   1    |  1
   --------+--------+--------+-----       1: print lines between [from,to]
    begpat |   1    |   0    |  1         0: don't print lines between [from,to]
   --------+--------+--------+-----
    endpat |   1    |   1    |  1


0 commentaires