Je sais qu’en utilisant le "-A NUM"
commutateur, je peux imprimer un nombre spécifique de lignes de fuite après chaque match. Je me demande simplement s'il est possible d'imprimer des lignes de fin jusqu'à ce qu'un mot spécifique soit trouvé après chaque correspondance. Par exemple, lorsque je recherche "Word A", je souhaite voir la ligne contenant "Word A" ainsi que les lignes suivantes jusqu'à celle contenant "Word D".
le contexte:
Word A
Word B
Word C
Word D
Word E
Word F
commander:
grep -A10 'Word A'
J'ai besoin de cette sortie:
Word A
Word B
Word C
Word D
| sed -e '1d;$d'
, qui est supprimer la première et dernière lignesed -n -e '/pattern A/,/pattern D/d; p'
Ceci dit: "Supprimez du motif A au motif D et imprimez tout le reste". Malheureusement, ce match est gourmand. Cela signifie que si les motifs A et D apparaissent plusieurs fois, vous ferez correspondre le premier motif A au dernier motif D. Je crains que Perl ou Python ne soient vos amis, si c'est le cas.pourquoi ne pas utiliser awk?
la source
Word D
tombe sur la même ligne queWord A
, et peut-être ailleurs, par exemple,Word A Word D\nWord D
avec sed affichera deux lignes où awk en indiquera une. De plus, on peut toujours utiliser des variables avec awk, par exempleawk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"
, sed est peut-être plus efficace, mais pour les recherches sur deux chaînes pouvant tomber ou non sur la même ligne, awk sera certainement plus fiable.A
etB
et que vous voulez pour capturer ce qui est entre chacune de ces séquences. il semble que sed ne suive pas cette sémantique, du moins dans mon cas.ou
la source
sed
, sauf si vous avez besoin de la puissance des expressions régulières Perl pour sélectionner les lignes de délimitation.