2016-04-11 12 views
0

Was ist der beste Weg, führende und nachgestellte Leerzeichen im XML-Wert zu zählen? wenn ich diese xml Insbesondere habe:Wie kann ich führende und nachfolgende Leerzeichen in xml mit awk zählen?

<?xml version="1.0" encoding="UTF-8"?> 
<dvm name="Filename" xml="http://www.google.it"> 
    <description>AL</description> 
    <columns> 
    <column>abcde</column> 
    <column>fg</column> 
    </columns> 
    <rows> 
    <row> 
     <cell id="1"> 08 4  </cell> 
     <cell id="2">AG</cell> 
    </row> 
    <row> 
     <cell id="1"> 00 6  </cell> 
     <cell id="2"> AL </cell> 
    </row> 
    <row> 
     <cell id="1">0 42 </cell> 
     <cell id="2">AN </cell> 
    </row> 
    </rows> 
</dvm> 

Wie kann ich zähle führende und nachgestellte Leerzeichen zwischen „>“ und dem ersten Auftreten von Zeichen/Ziffer und/oder zwischen dem letzten Zeichen/Ziffer und dem XML-End-Tag-Wert mit awk Befehl? Ich muss die Summe der führenden Leerzeichen und die Summe der abschließenden Leerzeichen kennen und sie in zwei Variablen setzen. Danke im Voraus.

Die Ausgabe sollte sein:

führende: 8

nachlauf: 20

Antwort

1

Bevor ich beginne, möchte ich sagen, dass dieser Ansatz sehr spröde ist; Es wird fehlschlagen, wenn Ihre XML-Datei anders formatiert ist, als Sie uns gezeigt haben, und selbst wenn eines der Tags bestimmte Zeichen enthält, z. B. Zeilenumbrüche. Bei der Arbeit mit XML ist awk nicht das richtige Werkzeug für den Job.

Das heißt, die Werte erhalten können Sie für die Eingabe Sie haben mit so etwas wie folgt dargestellt:

awk -F'[<>]' '$2 ~ /^cell/ { 
    if (match($3, /^ +/)) leading += RLENGTH 
    if (match($3,/+$/)) trailing += RLENGTH 
} END { print "leading: " leading+0, "trailing: " trailing+0 }' file 

Stellen Sie den Feldtrenn entweder < oder >, so wird der Inhalt der <cell> Tags ist das dritte Feld in dieser Zeile. Verwenden Sie match, um nach Leerzeichen am Anfang/Ende des Tag-Inhalts zu suchen. RLENGTH ist eine spezielle Variable, die auf die Länge der übereinstimmenden Zeichenfolge gesetzt wird.

+0

Hallo, danke für deine Antwort. mit Ihrem Code ist die Ausgabe: führen: Nachlauf: 4 – ciaccaro

+0

Vielleicht sind sie Tab-Zeichen? Es wäre einfach, sie als einzelne Leerzeichen zu behandeln, indem Sie '[[:: Leerzeichen:]]' in jedem der Muster anstelle eines Leerzeichen verwenden. –

+0

Es ist Leerzeichen, keine Tabs – ciaccaro

Verwandte Themen