Im Allgemeinen you don't. XML/HTML-Parsing ist schwer genug, ohne es präzise zu machen, und während Sie vielleicht in der Lage sind, eine Lösung zu hacken, die mit einer begrenzten Teilmenge von XML Erfolg hat, wird sie irgendwann brechen.
Außerdem, there are many great languages with great XML parsers already written, warum also nicht einen von ihnen verwenden und Ihr Leben einfacher machen?
Ich weiß nicht, ob es einen XML-Parser für awk gibt oder nicht, aber ich fürchte, wenn Sie XML mit awk analysieren wollen, werden Sie viele "Hämmer sind für Nägel, Schraubenzieher sind für Schrauben "Antworten. Ich bin mir sicher, dass es möglich ist, aber es wird Ihnen wahrscheinlich leichter fallen, in Perl etwas zu schreiben, das XML :: Simple (mein persönlicher Favorit) oder ein anderes XML-Parsing-Modul verwendet.
Nur der Vollständigkeit halber möchte ich darauf hinweisen, dass es sich bei ungültigem XML-Code nicht um ein gültiges Beispiel für die gesamte Datei handelt. Gültige XML sollten Start- und End-Tags haben, etwa so:
<netlist>
<net NetName="abc" attr1="123" attr2="234" attr3="345".../>
<net NetName="cde" attr1="456" attr2="567" attr3="678".../>
....
</netlist>
Ich bin sicher, dass ungültige XML seine Verwendung hat, aber einige XML-Parser darüber jammern kann, so dass, wenn Sie sich mit einem awk ein Toter Satz sind -liner versuchen, Ihr "XML" zu analysieren, sollten Sie in Betracht ziehen, Ihr XML gültig zu machen.
Als Antwort auf Ihre Bearbeitungen, ich werde tun es immer noch nicht als Einzeiler, aber hier ist ein Perl-Skript, das Sie verwenden können:
mit 1
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
sub usage {
die "Usage: $0 [NetName] ([attr])\n";
}
my $file = XMLin("file.xml", KeyAttr => { net => 'NetName' });
usage() if @ARGV == 0;
exists $file->{net}{$ARGV[0]}
or die "$ARGV[0] does not exist.\n";
if(@ARGV == 2) {
exists $file->{net}{$ARGV[0]}{$ARGV[1]}
or die "NetName $ARGV[0] does not have attribute $ARGV[1].\n";
print "$file->{net}{$ARGV[0]}{$ARGV[1]}.\n";
} elsif(@ARGV == 1) {
print "$ARGV[0]:\n";
print " $_ = $file->{net}{$ARGV[0]}{$_}\n"
for keys %{ $file->{net}{$ARGV[0]} };
} else {
usage();
}
Führen Sie dieses Skript von der Kommandozeile oder 2 Argumente. Das erste Argument ist 'NetName'
, das Sie suchen möchten, und das zweite ist das Attribut, das Sie suchen möchten. Wenn kein Attribut angegeben wird, sollte es nur alle Attribute für dieses 'NetName'
auflisten.
versuchen, dich nicht zu schreien, aber wenn Sie eine Frage stellen, können Sie auf der rechten Seite sehen, und es wird Ihnen eine schöne Formatierung Führung zeigen, so dass Ihr Code gut aussehen und hervorgehoben werden. –
Vergessen Sie awk für solche "reiche" und komplexe Aufgaben - Perl ist wirklich entworfen, um alle awk tun können, nur besser (und wenn Sie in neueren Sprachen wie Ruby oder Python scharf sind, sind sie auch in Ordnung, aber Perl ist näher an awk entlang vieler Achsen). –
XPath: // net [@ NetName = "abc"]/attribut :: attr3 gibt 345 zurück – bernie