Wenn mit bash tatsächlich nur die Bash gemeint ist, kann ich dir nicht helfen. Du solltest wirklich die richtigen Tools für den Job verwenden. Wenn du standardmäßige UNIX-Dienstprogramme meinst, die du von der Bash aus aufrufen kannst, würde ich dafür awk
verwenden.
echo 'Zeile a - das ist Zeile a
Zeile b - das ist Zeile b
Zeile c - das ist Zeile c
Zeile d - das ist Zeile d
Zeile e - das 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 - das ist Zeile b
Zeile c - das ist Zeile c
Zeile d - das ist Zeile d
Die Funktionsweise ist einfach.
- e ist der Echo-Flag, anfangs auf false (0) gesetzt.
- Wenn du Zeile b findest, setze Echo auf true (1) - drucke noch nicht. Das wird vom letzten Punkt unten gehandhabt.
- Wenn du Zeile d findest und Echo aktiv ist, drucke sie und beende.
- Wenn Echo aktiv ist, drucke die Zeile (das beinhaltet auch Zeile b).
Ich gehe hier davon aus, dass du nicht bei einer Zeile d beenden möchtest, es sei denn, du echoest bereits. Wenn das falsch ist, verschiebe das Beenden außerhalb der if-Anweisung für Zeile d:
/^Zeile d/ {if (e==1) print;exit}
Dann, wenn du eine Zeile d vor deiner Zeile b bekommst, wird es einfach beenden, ohne etwas zu echoen.
Die "/^Zeile X/"
-artigen Klauseln können sehr leistungsstark gemacht werden, um praktisch alles zu passen, was du ihm entgegenwirfst.