Ich weiß, dass ich mit dem "-A NUM"
Schalter nach jeder Übereinstimmung eine bestimmte Anzahl von nachgestellten Zeilen drucken kann. Ich frage mich nur, ob es möglich ist, nachstehende Zeilen zu drucken, bis nach jedem Treffer ein bestimmtes Wort gefunden wird. zB Wenn ich nach "Word A" suche, möchte ich die Zeile mit "Word A" und die Zeilen danach bis zu der Zeile mit "Word D" sehen.
Kontext:
Word A
Word B
Word C
Word D
Word E
Word F
Befehl:
grep -A10 'Word A'
Ich brauche diese Ausgabe:
Word A
Word B
Word C
Word D
| sed -e '1d;$d'
, das heißt entferne die erste und letzte Zeilesed -n -e '/pattern A/,/pattern D/d; p'
"Löschen Sie von Muster A zu Muster D und drucken Sie alles andere". Leider ist dieses Match gierig. Das heißt, wenn Muster A und D mehrmals auftreten, werden Sie vom ersten Muster A zum letzten Muster D passen . Ich fürchte, Perl oder Python sind Ihre Freunde, wenn das der Fall ist.warum nicht awk benutzen?
quelle
Word D
auf die gleiche Linie fällt wieWord A
, und möglicherweise an einer anderen Stelle, z. B. wennWord A Word D\nWord D
sed zwei Linien anzeigt, während awk eine anzeigt. Zusätzlich kann man mit awk noch Variablen verwenden, z. B.awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"
, so dass es vielleicht effizienter ist, aber wenn man sich mit der Suche nach zwei Zeichenketten befasst, die auf die gleiche Zeile fallen oder nicht, ist awk definitiv zuverlässiger.A
und enthältB
und Sie nur erfassen möchten, was zwischen diesen Sequenzen liegt. anscheinend folgt sed zumindest in meinem fall nicht dieser semantik.oder
quelle
sed
, es sei denn, Sie benötigen die Leistungsfähigkeit regulärer Perl-Ausdrücke, um die Begrenzungslinien auszuwählen.