Brauche Hilfe bei einem AWK-Script
Klaus
- programmiertechnik
Hallo zusammen,
ich habe eine recht große XML-Datei, die ich mittels des AWK-Scripts parsen möchte.
Die Struktur der XML-Datei sieht folgendermaßen aus:
<trustee path="/DESIGN">
<name>.DESIGN.Entwicklung.FIRMA</name>
<rights>RWCEMF</rights>
<object_guid>382478a-838e-22d7-c75f-0009c74543b0</object_guid>
</trustee>
<trustee path="/DESIGN/ Druck">
<name>.Mustermann.Entwicklung.FIRMA</name>
<rights>RWCEMF</rights>
<object_guid>a3925401-dbcb-27d5-e072-0000f8a7c3b1</object_guid>
</trustee>
Über die Befehlszeile
awk -f /scripts/list.awk DEP=2 trustee_database.xml | grep -i mustermann
bekomme ich aber ein Problem, wenn im trustee path ein Leerzeichen enthalten ist (wie im Beispiel beim Ordner ' Druck'.
Die Anzeige bricht dann quasi nach /DESIGN/ ab und ist damit nicht korrekt.
Vielleicht kann sich einer das Script anschauen, wie ich auch diese Ordner korrekt angezeigt bekomme?
Hier natürlich noch das AWK-Script:
BEGIN { RS="<"; FS=">"; ORS="\r\n";
# Change this to alter how many close-tags in a row are needed
# before a row of data is printed.
if(!DEP) DEP=1
SEP="\t"
}
# Skip weird XML specification lines or blank records
/^\?/ || /^$/ { next }
# Handle close tags
/^[/]/ {
N=D; while((N>0) && ("/"STACK[N] != $1)) N--;
if("/"STACK[N] == $1) D=(N-1);
POP++;
if(POP == DEP)
{
if(!HEADER++)
{
split(ARG[1], Z, SUBSEP);
printf("%s %s", Z[2], Z[3]);
for(N=2; N<=ARG_; N++)
{
split(ARG[N], Z, SUBSEP);
printf("%s%s %s", SEP, Z[2], Z[3]);
}
printf("\n");
}
printf("%s", DATA[ARG[1]]);
for(N=2; N<=ARG_; N++)
printf("%s%s", SEP, DATA[ARG[N]]);
printf("\n");
}
next
}
# Handle open tags
{
gsub(/^[ \r\n\t]*/, "", $2); # Whitespace isn't data
gsub(/[ \r\n\t]*$/, "", $2);
sub(/\/$/, "", $(NF-1));
# Reset parameters
POP=0;
M=split($1, A, " ");
STACK[++D]=A[1];
if((!MAX) || (D>MAX)) MAX=D; # Save max depth
# Handle parameters
Q=split(A[2], B, " ");
for(N=1; N<=Q; N++)
{
split(B[N], C, "=");
gsub(/['"]/,"", C[2]);
I=D SUBSEP STACK[D] SUBSEP C[1];
if(!SEEN[I]++)
ARG[++ARG_]=I;
DATA[I]=C[2];
}
if($2)
{
I=D SUBSEP STACK[D] SUBSEP "CDATA";
if(!SEEN[I]++)
ARG[++ARG_]=I;
DATA[I]=$2;
}
}