2016-03-29 12 views

Antwort

1

Auch wenn ich nicht davon überzeugt bin, dass Parsing XML wie Datei mit entweder sed oder awk ist eine gute Idee, können Sie Folgendes versuchen:

awk ' /^<.*>/{ if(tag != ""){print tag; }; match($0,"^<(.*)>.*",a); tag= "</" a[1] ">";} {print} END{print tag}' mytextfile 

Die Funktion match() in awk ermöglicht das Extrahieren von Regex aus einer Zeichenfolge mit dem Array a.

Die if und END Aussagen sind hier, um den Anfang und das Ende der Datei zu fangen.

+0

Gut zu beachten, dass das Array-Argument zu 'match' eine gawk-only-Erweiterung ist. Mit regulärem awk können Sie etwas in Übereinstimmung mit 'match ($ 0," <.*> ") tun; tag = " jas

+0

Danke 'awk '/^<.*>/{if (tag! =" ") {Print tag;}; Übereinstimmung ($ 0, "<[A-Z-]+>"); tag = "

2

OR

awk -v RS="<" 'NR!=1{print "<"$0"</"$1}'

RS ist die Aufzeichnung separetor. Es ermöglicht das Lesen eines mehrzeiligen Datensatzes.

NR=1 überspringt den ersten Datensatz (leer in dem gegebenen Beispiel)

Der Druck Anweisung gibt die Multilinienaufzeichnung (den Gehalt zwischen 2 <) und fügt den Tag-Namen $1, die direkt nach dem Datensatztrennzeichen ist.

+0

Während dieser Code die Frage beantworten kann, bietet zusätzlichen Kontext in Bezug auf _why_ und/oder _how_ dieser Code Antworten die Frage würde deutlich verbessern langfristigen Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung zu hinzuzufügen. –

+0

Bessere Antwort als meine. Ich habe ein bisschen mehr Erklärung gegeben. Der Trick mit dem 'RS' ist nett! – oliv

+0

Danke für die Bearbeitung. :-) – 7171u

Verwandte Themen