Ja, das ist diffizil und ich könnte nicht sagen diese Ecke von sed zu beherrschen, aber für eine Version 2.0 hat mein Verständnis gereicht:
Fried-rich schrieb:
Kannst du mir kurz erklären was mit den {} gemacht wird?
Statt einen Befehl kann man in geschweiften Klammern auch mehrere Befehle angeben. Das ist einerseits großartig, andererseits scheitere ich daran in 90% der Fälle, in denen ich es versuche. ☺
| sed '/9/,/8/{/8/,/9/d}'
sed '/von/,/bis/{mehrere Befehle}'
|
Hat man mehrere Befehle, dann muss man diese mit Semikolon voneinander abtrennen. Das ist hier aber nicht der Fall, aber ich habe so eine zweite Bedingung eingeführt. Ohne die geschweiften Klammern bekommt man einen Syntaxfehler. Sicher kann man sehr spaßig die Verschachtelung noch tiefer und tiefer treiben. ☺
In Prosa ausgedrückt würde ich sagen:
Von einer Zeile mit 9 bis zu einer Zeile mit 8: Lösche alle Zeilen von denen mit einer 8 bis zu denen mit einer 9.
Nach der letzten, gefundenen 8 wird zwar keine 9 mehr gefunden, aber sed ist da nicht pingelig. Weil es Zeilenweise arbeitet geht es optimistisch davon aus, dass noch eine 9 kommen wird und löscht bis Dateiende. Das war dann auch mein Ansatz für Script (hört, hört) 2.0:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | echo -e "\n"{16..42} | sed '/9/,/$$/{/7/,/9/d}'
16
17
18
19
20
21
22
23
24
25
26
30
31
32
33
34
35
36
40
41
42
|
Man kann auch $$ explizit für's Dateiende nehmen und 8 habe ich durch 7 ersetzt, damit nicht nur die explizit erwähnten Grenzen gelöscht werden, sondern auch was dazwischen.
Ab der ersten Zeile mit einer 9 (hier einer 19): Lösche alle Bereiche, die eine 7 irgendwo matchen bis sie eine 9 matchen.