Comment puis-je sélectionner la première occurrence entre deux modèles, y compris les. Utiliser de préférence sed
ou awk
.
J'ai:
text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Je veux la première occurrence des lignes entre P1 et P2 (y compris la ligne P1 et la ligne P2):
something P1 something
content1
content2
something P2 something
sed
awk
regular-expression
kofucii
la source
la source
sed
... c'est un bug dans votresed
fonctionnement, et non dans le script ci-dessus./P2/q
sur mon système; c'est ça. J'étais curieux de savoir quelque chose et je voulais partager ce que j'ai trouvé.avec
awk
la source
Dans
sed
:-n
supprime l'impression par défaut et vous imprimez des lignes entre les plages d'adresses correspondantes à l'aide de lap
commande.q
) lors de la premièreP2
correspondance.Cela échouera si un
P2
vient avantP1
. Pour gérer ce cas, essayez:la source
Si vous souhaitez ignorer les modèles eux-mêmes, voici la
awk
version:la source
Une simple
awk
solution (tri de mi - chemin entre la réponse de Iruvar et la réponse de Muru , mais pas en utilisant une variable):et, comme l'a noté muru, si le premier P2 apparaît avant le premier P1, cela n'imprimera rien.
Bien sûr, si vous souhaitez imprimer toutes les plages P1-P2:
laissez de côté la
exit
partie:la source
Quittez immédiatement après l'impression, pas avant.
la source
Pour ignorer les modèles eux-mêmes et n'afficher que le premier bloc correspondant dans un seul GNU sed:
la source