2016-12-26 9 views
2

Ich möchte dieses Stück xml konvertieren:Remove Namespacepräfix mit sed

<v1:table> 
    <v1:tr> 
    <v1:td>Apples</v1:td> 
    <v1:td>Bananas</v1:td> 
    </v1:tr> 
</v1:table> 

in den folgenden durch die Namespacepräfixe Entfernen (dh v1) und die folgenden erhalten, indem mit sed:

<table> 
    <tr> 
    <td>Apples</td> 
    <td>Bananas</td> 
    </tr> 
</table> 

Ist es möglich?

EDIT: Ich möchte auch angeben, dass das XML in einer Datei gespeichert ist.

+0

Nein, mit 'sed' ist es unmöglich:' sed' basiert auf regulären Ausdrücken und XML ist keine reguläre Sprache. Erwägen Sie die Verwendung eines echten XML-Parsers. Sie sehen möglicherweise Antworten, die Ihnen Snippets geben, die _seem_ an Ihrem spezifischen Spielzeugbeispiel funktionieren, aber es wäre sehr einfach, eine (gültige XML-) Datei zu erstellen, auf der es fehlschlägt. –

+0

Sie möchten die Namespaces nicht entfernen. Aufhören zu versuchen. Erklären Sie, was Sie wirklich erreichen möchten (oder warum Sie glauben, dass das Entfernen der Namespaces Ihnen helfen würde). – Tomalak

+1

Ich möchte XML in eine Java-Klasse konvertieren mit Spring Framework [XStreamMarshaller] (http://docs.spring.io/spring-framework/docs/4.2.2.BUILD-SNAPSHOT/javadoc-api/org/springframework/oxm /xstream/XStreamMarshaller.html). Um die gleichen Tags wie die Klassenfelder zu haben, möchte ich die Präfixe loswerden. Ich benutze nur bash und sed, bevor ich den Spring Batch laufe, deshalb bin ich geneigt, sed zu benutzen. – vahdet

Antwort

1

Diese sed Werke für Ihr Beispiel:

sed -E 's~(</?)v1:~\1~g' file 

<table> 
    <tr> 
    <td>Apples</td> 
    <td>Bananas</td> 
    </tr> 
</table> 

jedoch nur ein Hinweis, dass sed für das Parsen von HTML/XML nicht das beste Werkzeug ist. Erwägen Sie die Verwendung von HTML-Parsern.

3

Hier ist, wie Sie es mit hxpipe tun konnte und hxunpipe vom W3C HTML-XML-utils (packagedformanydistributions):

$ hxpipe infile | sed 's/^\([()]\)v1:/\1/g' | hxunpipe 
<table> 
    <tr> 
    <td>Apples</td> 
    <td>Bananas</td> 
    </tr> 
</table> 

hxpipe parst XML/HTML und verwandelt es in ein awk/sed freundliche Linie basiertes Format:

$ hxpipe infile 
(v1:table 
-\n 
(v1:tr 
-\n  
(v1:td 
-Apples 
)v1:td 
-\n  
(v1:td 
-Bananas 
)v1:td 
-\n 
)v1:tr 
-\n 
)v1:table 
-\n 

wo Zeilen beginnend mit ( und ) sind öffnende und schließende Tags, so dass das Entfernen der ersten v1: von Zeilen beginnend mit ( oder ) (was der sed-Befehl oben tut) den gewünschten Effekt erzielt. Beachten Sie, dass Textzeilen mit einer - beginnen, daher kann es keine falschen Positiven geben.