PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sed, egrep Zeilenbereich



Romanday
07-09-2004, 15:11
Wie kann ich anhand eines regulären Ausdrucks mehrere Zeilen
zwischen 2 Tags finden?



Dies ist ein Text

<TAG>
Das soll
gefunden
werden.
</TAG>

Dies noch ist ein Text


Alles was zwischen <TAG> und </TAG> steht soll gefunden werden,
einschließlich Sonderzeichen und Whitespaces.

Kann man das irgenwie mit egrep, Sed oder AWK verwirklichen?

(Möchte auf Perl, PHP und Python in diesem Fall verzichten.)

peschmae
07-09-2004, 16:33
sed -n "/<TAG>/,/<\/TAG>/p" < test.txt


Wenn <TAG> allerdings mehrmals vorkommt dann wird alles zwischen dem ersten und dem letzten </TAG> ausgegeben.

MfG Peschmä

Claudine
07-09-2004, 17:58
[code]
Wenn <TAG> allerdings mehrmals vorkommt dann wird alles zwischen dem ersten und dem letzten </TAG> ausgegeben.



Klasse peschmae, das hilft schon mal.

Kann man eventuell das Script so ändern, dass <TAG> und </TAG> nicht
in der Ausgabe erscheinen?

Könnte man nicht, wenn ein und die selben Tags mehrmals vorkommen,
die jeweiligen Ausgabe in einem nummerischen Array (Shellarray) speichern?

Das würde doch den Zugriff erheblich erleichtern.

(Von Sed hab ich leider keinen Schimmer.)

peschmae
07-09-2004, 19:58
Kann man eventuell das Script so ändern, dass <TAG> und </TAG> nicht
in der Ausgabe erscheinen?

Naja, einfach noch ein s#<.?TAG>## anhängen.



Könnte man nicht, wenn ein und die selben Tags mehrmals vorkommen,
die jeweiligen Ausgabe in einem nummerischen Array (Shellarray) speichern?


Nein. Darum ist mein Post auch halb eine Frage. Sed-Regexps sind grundsätzlich immer "greedy" - d.h. immer so gross wie möglich. Wenn ich den Bereich wie oben Festlege matcht das _immer_ den allerersten <TAG> und den allerletzten </TAG>

Soll das auch für mehrere <TAG></TAG>s gehen? Dann wirds etwas komplizierter - ich fang mal an ;)

MfG Peschmä

peschmae
07-09-2004, 20:10
So, hier mal ein Sed-Script was einfach alles Zwischen <TAG> und </TAG>s ausgibt - allerdings noch keine Trennungsmöglichkeit von Text zwischem erstem und anderen <TAG></TAG>-Paaren.

Ausführen: sed -n -f sedscript.sed data.txt


/<TAG>/ {
h
c
}

/<\/TAG>/ {
H
g
s#<TAG>##
s#</TAG>##
p
}

H



Wenn man beim p noch ein q (uit) anhängt wird nur die erste Fundstelle angegeben:
Ausführen: sed -n -f sedscript.sed data.txt


/<TAG>/ {
h
c
}

/<\/TAG>/ {
H
g
s#<TAG>##
s#</TAG>##
p
q
}

H


die kann man jetzt natürlich aus der Datei entfernen à la


sed -e "0,/<TAG>/d" -e "0,/<\/TAG>/d" -i data.txt

und dann das Script auf die nächste Fundstelle loslassen. Eine schlauere Variante um die Daten aus sed nach Bash zu kriegen fällt mir eben gerade nicht ein.

MfG Peschmä

Claudine
10-09-2004, 08:29
Meine alte Gundschullehrerin sagte immer: Wenn Du das gut machst
bekommst Du ein Bienchen.

2 Bienchen für peschmae :D :D

Der Trick mit dem Puffer is gut.

Problem: Wie kann ich Sed eine Shellvariable interpretrieren lassen?

s#</TAG>#$TRENNER#

funktioniert leider nicht, wenn das Sed Script sich in einer seperaten Datei
befindet.

peschmae
10-09-2004, 10:15
Da kenne ich keine Lösung ausser:

- das Sed-Script mit sed s#PLATZHALT0R#$VARIABLE# zu bearbeiten
- das ganze halt nicht in ein separates Sed-Script zu schreiben

MfG Peschmä

ThorstenS
12-09-2004, 15:06
Es gibt doch mächtige XML parser, evtl. könnte man die bei dem Problem heranziehen?!

Claudine
12-09-2004, 17:38
Es gibt doch mächtige XML parser, evtl. könnte man die bei dem Problem heranziehen?!

Hast Du eventuell ein Beispiel zur Hand?