Mit sed etwas in bestimmter Reihenfolge suchen und Ausgeben

29/08/2007 - 08:34 von Knut Rauscher | Report spam
Moin,

ich komme mit meinen sed Kenntnissen mal wieder nicht so richtig weiter.
vielleicht kann mir einer von euch etwas unter die Arme greifen.

Ein kleiner Inhalt aus der XML-Datei:


,-
| <DeliveryMessageNumber>4711</DeliveryMessageNumber>
|
| <SupplierParty>
| <PartyIdentifier PartyIdentifierType="AssignedBySeller">21</PartyIdentifier>
| <NameAddress>
| <Name1>Test-Name1</Name1>
|
| <SupplierParty>
| <PartyIdentifier PartyIdentifierType="AssignedBySeller">21</PartyIdentifier>
| <NameAddress>
| <Name1>Test-Name2</Name1>
`-

ich brauche einmal die "DeliveryMessageNumber" und den "Name1". Wobei
ich nur Name1 brauche wenn er das erstemal auf SupplierParty trifft.

Was ich bis jetzt selber lösen konnte ist folgendes:

sed -n 's%^.*<DeliveryMessageNumber>\(.*\)</DeliveryMessageNumber>.*$%\1%p' file.xml
4711

sed -n 's%^.*<Name1>\(.*\)</Name1>.*$%\1%p' file.xml
Test-Name1
Test-Name2

Ich würde es gerne so erreichen, das die Datei Sequenziell durchlaufen
wird. Beim ersten finden von DeliveryMessageNumber mir die 4711 ausgibt.
Weiter làuft und beim ersten finden von SupplierParty mir das erste
Name1 nach SupplierParty sucht und Test-Name1 auswirft.

Bekommt man das mit sed hin? Wenn nicht würde ich sonnst auch auf
awk wechseln aber leider sind meine Kenntnisse was awk angeht nicht
so gut.

Schöne Grüße

sendet Knut
 

Lesen sie die antworten

#1 Alexander Bartolich
29/08/2007 - 09:20 | Warnen spam
Knut Rauscher schrieb:
[...]
Ich würde es gerne so erreichen, das die Datei Sequenziell durchlaufen
wird. Beim ersten finden von DeliveryMessageNumber mir die 4711 ausgibt.



Das ist einfach.

Weiter làuft und beim ersten finden von SupplierParty mir das erste
Name1 nach SupplierParty sucht und Test-Name1 auswirft.



Also das das nàchste "Name1" nach "DeliveryMessageNumber" ist nicht so
schwer. Wenn es wirklich nur das nàchste "Name1" nach dem nàchsten
"SupplierParty" werden soll, wird es umstàndlich.

$ cat a.sed
#!/bin/sed -nf

/^.*<DeliveryMessageNumber>\(.*\)<\/DeliveryMessageNumber>.*$/ {
s//\1/p
:loop
n
s/^.*<Name1>\(.*\)<\/Name1>.*$/\1/p
T loop
}

$ sed -nf a.sed input
4711
Test-Name1

news.albasani.net

Ähnliche fragen