SED letzte Zeile löschen

F

fwalser

Grünschnabel
Hallo,

habe ein Problem mit folgendem sed Befehl

sed -n '/regexp1/,/regexp2/p'
# gibt den inhalt zwischen regexp1 und regexp2 an inklusive regexp1 + regexp2.

Nun benutz ich diesen sed Befehl um bestimmte Teile aus einer HTML Seite zu lesen
und lösche anschliessend mit einem weieren sed Befehl alle HTML-Tags raus.

Das Problem an der ganzen Sache ist nur, dass ich die letzte Zeile nicht brauch bzw. es eigentlich lauten müsste
Ausgabe von einschliesslich. regexp1 bis ausschliesslich regexp2.

Das ganze hab ich auch mit awk versucht:
awk '/regexp1/ {flag=1;next} /regexp2/ {flag=0} flag {print}
Problem hier ist, er zeigt zwar alles dazwischen an aber die Zeile 1 mit dem regexp1 fehlt dann :/ bzw. wird dann immer geschluckt.


hab schon rumprobiert '$d' einzubauen usw. aber das will nicht so recht.
Desweiteren hab ich mein Glück mit head/tail -n -1 ... versucht.

Wenn ich das wie oben probiere ist das Problem, dass nur einmal die Zeile ganz am schluss weggeschnitten bzw. gelöscht wird aber nicht ein weiteres mal (davor, danach wie auch immer).

Jemand ne idee, was ich da noch hinzufügen muss bzw. wie der sed Befehl richtig lauten würde ?
Über Hilfe würde ich mich freuen.
 
Zuletzt bearbeitet:
Hallo,
keine schöne Lösung, aber als Notlösung: einfach mit sed die letzte Zeile löschen (per sed '$d'), an Deinen sed-Befehl anhängen (mit -e oder PIPE).
Gruß zst
 
Hi und danke erstmal für die Antwort.
Das Problem an der ganzen Sache ist folgendes. (Hab es oben schon probiert zu erklären, evtl. ein wenig umständlich ;) ) naja ich versuchs mal bisschen zu veranschaulichen .

Ausgabe aktuell:
Bedeutungen:
[1] Compact Disc
[2] Demokratische Republik Kongo
Synonyme: <----- unerwünschte Zeile
Bedeutungen:
[1] Cluster of differentiation
[2] Corps Diplomatique
[3] Corporate Design
Gegenwörter: <----- unerwünschte Zeile
Bedeutungen:
[1] Compact Disc
[2] Corps Diplomatique
Beispiele: <----- unerwünschte Zeile

Ausgabe gewünscht
Bedeutungen:
[1] Compact Disc
[2] Demokratische Republik Kongo
Bedeutungen:
[1] Cluster of differentiation
[2] Corps Diplomatique
[3] Corporate Design
Bedeutungen:
[1] Compact Disc
[2] Corps Diplomatique

Ausgabe mit deinem Vorschlag:
Bedeutungen:
[1] Compact Disc
[2] Demokratische Republik Kongo
Synonyme: <----- unerwünschte Zeile
Bedeutungen:
[1] Cluster of differentiation
[2] Corps Diplomatique
[3] Corporate Design
Gegenwörter: <----- unerwünschte Zeile
Bedeutungen:
[1] Compact Disc
[2] Corps Diplomatique

D.h. er durchsucht bei mir eine Internetseite z.b. nach dem Regulären Ausdruck "Bedeutungen:" nimmt alles zwischen Bedeutungen und einem HTML-Tag und gibt leider die letzte Zeile in der das HTML Tag war mit aus.
In dem Fall .z.b. 1x Synonyme, 1x Gegenwörter und Beispiele. Versuche ich nun jeweils die letzte Zeile eines "blocks" zu löschen wird mit sed '$d' jedoch nur die allerletzte Zeile gelöscht und nicht die anderen.
Ich hoffe es ist verständlich.
 
Zuletzt bearbeitet:
egrep

Falls Du hinreichende alternative regexps für Deine gewünschten Zeilen finden kannst, sollte egrep bzw. "grep -e" Dein Freund sein:


Code:
grep -e '^Bed\|^\[[1-9]' test.txt
 
Code:
sed -n '/regexp1/,/regexp2/{/regexp2/!p}'
 
Code:
sed -n '/regexp1/,/regexp2/{/regexp2/!p}'

da erhalt ich dann das selbe wie wenn ich
awk '/regexp1/ {flag=1;next} /regexp2/ {flag=0} flag {print} nutzen würde... hab nun einen mix aus sed und awk
mein zusätzlicher awk teil lautet wie folgt :
awk '! /regexp/ || /regexp/ {print $0}'
 
also bei mir funktionierts: gnu sed 4.2.2 in der bash; zumindest funktionierts so wie ichs verstanden habe :P

Code:
doc@chaos:/tmp$ cat test 
Bedeutungen: 
 [1] Compact Disc
 [2] Demokratische Republik Kongo
 Synonyme: <----- unerwünschte Zeile
 Bedeutungen:
 [1] Cluster of differentiation
 [2] Corps Diplomatique
 [3] Corporate Design
 Gegenwörter:  <----- unerwünschte Zeile
 Bedeutungen:
 [1] Compact Disc
 [2] Corps Diplomatique
 Beispiele: <----- unerwünschte Zeile
doc@chaos:/tmp$ sed -n '/Bedeutungen:/,/unerwünschte Zeile/{/unerwünschte Zeile/!p}' test 
Bedeutungen: 
 [1] Compact Disc
 [2] Demokratische Republik Kongo
 Bedeutungen:
 [1] Cluster of differentiation
 [2] Corps Diplomatique
 [3] Corporate Design
 Bedeutungen:
 [1] Compact Disc
 [2] Corps Diplomatique

mit awk funktioniert es bei mir im übrigen so:

awk '/Bedeutungen:/ {flag=1} /unerwünschte Zeile/ {flag=0} flag {print}'
 
Zuletzt bearbeitet:

Ähnliche Themen

sed - Bitte um Unterstützung

Textdatei filtern und löschen mit grep /sed

3 letzte Zeile löschen oder ab Zeile 55 Muster suchen und löschen

Probleme mit sed: im Text eine Zeile in Großbuchstaben ?

reverse x11vnc über ssh will einfach nicht :-(

Zurück
Oben