Wenn Sie mit "Bash" tatsächlich nur die Bash meinen, kann ich Ihnen nicht helfen. Sie sollten wirklich die richtigen Werkzeuge für den Job verwenden. Wenn Sie jedoch die standardmäßigen UNIX-Dienstprogramme meinen, die Sie von der Bash aus aufrufen können, würde ich dafür awk
verwenden.
echo 'Zeile a - dies ist Zeile a
Zeile b - dies ist Zeile b
Zeile c - dies ist Zeile c
Zeile d - dies ist Zeile d
Zeile e - dies ist Zeile e' | awk '
BEGIN {e=0}
/^Zeile b/ {e=1}
/^Zeile d/ {if (e==1) {print;exit}}
{if (e==1) print}
'
Dies gibt aus:
Zeile b - dies ist Zeile b
Zeile c - dies ist Zeile c
Zeile d - dies ist Zeile d
Das Funktionsprinzip ist einfach.
- e ist der Echo-Indikator, zu Beginn auf falsch (0) gesetzt.
- Wenn Sie Zeile b finden, setzen Sie Echo auf wahr (1) - noch nicht drucken. Dies wird durch den letzten Punkt unten behandelt.
- Wenn Sie Zeile d finden und Echo aktiv ist, drucken Sie es und beenden Sie.
- Wenn Echo aktiv ist, drucken Sie die Zeile (das beinhaltet Zeile b).
Ich habe hier die Annahme gemacht, dass Sie bei einer Zeile d nicht beenden möchten, es sei denn, Sie echoen bereits. Wenn das falsch ist, verschieben Sie das exit außerhalb der if-Anweisung für die Zeile d:
/^Zeile d/ {if (e==1) print;exit}
Dann, wenn Sie eine Zeile d vor Ihrer Zeile b erhalten, wird einfach ohne etwas zu echoen beendet.
Die "/^Zeile X/"
-artigen Klauseln können sehr leistungsstark gemacht werden, um praktisch alles zu finden, was Sie ihnen vorwerfen.