zwischen zwei zeilen suchen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

zwischen zwei zeilen suchen

Beitrag von lisan » 06.03.2007 14:10:06

Hi,

ich moechte ab einer zeile beginnend mit "dn:" nach zeilen suchen die z.B. "foobar" beeinhalten. Treffer muessen der Zeile "dn:" zuordbar sein. Es soll immer nur unterhalb einer Zeile mit "dn:" gesucht werden bis die naechste auftaucht.
Das Ziel ist es alle Zeilen "dn: .*" zu finden, unterhalb derer etwas bestimmtes gefunden wird.
Mit sed gelang mir das irgendwie nicht.
Idee ?

Benutzeravatar
HELLinG3R
Beiträge: 1328
Registriert: 15.04.2004 07:54:33

Beitrag von HELLinG3R » 06.03.2007 15:09:15

Hm, spontan würde ich da ein kleines Perlscriptlein basteln.

Es würde den standardinput zeilenweise einlesen und eine Variable setzen, sobald "dn: ...." vorkommt.
Sobald dann "foobar" kommt, wird der dn zusammen mit foobar ausgegeben :)
Sollte eigentlich ein 4-5 Zeiler sein.
Perl macht Spass.

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 08.03.2007 10:10:38

AH, das habe ich befürchtet, ich hatte lange gehofft, das mit awk oder sed hinzubekommen.

Benutzeravatar
HELLinG3R
Beiträge: 1328
Registriert: 15.04.2004 07:54:33

Beitrag von HELLinG3R » 08.03.2007 10:30:53

hm awk könnte auch gehen.
Perl macht Spass.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 08.03.2007 10:49:32

meinst du so:

Code: Alles auswählen

root@gms4:~# cat x.txt
dn: abc
dn: bce
  bla foobar blub
dn: cde
dn: def
  blub foobar bloek


root@gms4:~# awk '/^dn/{ll=$0} /foobar/{print ll}' x.txt
dn: bce
dn: def
Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.03.2007 12:13:42

Sehr interessant.

Doch leider verstehe ich die Zeile

Code: Alles auswählen

awk '/^dn/{ll=$0} /foobar/{print ll}' file
nicht ganz.

Ok, es soll zwischen /^dn/ und /foobar/ gesucht werden. Quasi wie ein awk '/<irgendwas>/,/<irgendwas</'.

Aber wie genau muss ich denn das {ll=$0} verstehen?
Kenn ich gar nicht.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 08.03.2007 12:28:43

Duff hat geschrieben:Aber wie genau muss ich denn das {ll=$0} verstehen?
Kenn ich gar nicht.
ist eine Zuweisung, daher wird der Inhalt von $0 in der Variablen "ll" gespeichert

Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.03.2007 13:20:08

Sorry, aber so ganz verstehe ich dass noch immer nicht.

Wieso wird in $0 denn der letzte gefunde Wert von dn vor dem Suchmuster gespeichert?
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 08.03.2007 13:50:27

Duff hat geschrieben:Wieso wird in $0 denn der letzte gefunde Wert von dn vor dem Suchmuster gespeichert?
awk speichert immer die aktuelle Zeile in "$0" ( die erste Spalte in "$1", ...usw)

Monika
Beiträge: 58
Registriert: 05.03.2007 15:59:39

Re: zwischen zwei zeilen suchen

Beitrag von Monika » 08.03.2007 14:06:43

lisan hat geschrieben:Hi,

ich moechte ab einer zeile beginnend mit "dn:" nach zeilen suchen die z.B. "foobar" beeinhalten. Treffer muessen der Zeile "dn:" zuordbar sein. Es soll immer nur unterhalb einer Zeile mit "dn:" gesucht werden bis die naechste auftaucht.
Das Ziel ist es alle Zeilen "dn: .*" zu finden, unterhalb derer etwas bestimmtes gefunden wird.
Mit sed gelang mir das irgendwie nicht.
Idee ?
sed arbeitet doch zeilenweise, damit kann es also gar nicht gehen, oder?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: zwischen zwei zeilen suchen

Beitrag von gms » 08.03.2007 14:38:50

Monika hat geschrieben: sed arbeitet doch zeilenweise, damit kann es also gar nicht gehen, oder?
"sed" ist nicht ganz so mein Ding, aber es geht damit auch:

Code: Alles auswählen

root@gms4:~# sed -n -e '/^dn:/h' -e '/foobar/{g;p}' x.txt
dn: bce
dn: def
mit "h" wird die aktuelle Zeile zwischengespeichert und mit "g" wieder hervorgeholt und mit "p" ausgegeben.

Gruß
gms

Monika
Beiträge: 58
Registriert: 05.03.2007 15:59:39

Beitrag von Monika » 08.03.2007 14:52:59

Wow 8O

Benutzeravatar
lisan
Beiträge: 658
Registriert: 22.02.2003 19:05:04
Wohnort: Berlin
Kontaktdaten:

Beitrag von lisan » 12.03.2007 14:02:09

Danke, sehr schoene loesungen.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 13.03.2007 08:22:00

gms hat geschrieben: "sed" ist nicht ganz so mein Ding, aber es geht damit auch:
...naja, auf eine solche Lösung muss man aber erst mal kommen bzw. kann man doch eigentlich nur kommen, wenn man sich schon gut mit sed auskennt.

Nicht schlecht.
Oh, yeah!

Antworten