2009-11-12 9 views
7

Wie lösche ich Kommentare in XML?Vim - Löschen von XML-Kommentaren

Wenn die öffnenden und schließenden Kommentartags in derselben Zeile sind, verwende ich :g/^<!--.*-->$/d, um den Kommentar zu löschen. Wie lösche ich die Kommentare, die über viele Zeilen verteilt sind?

Antwort

17

\_. statt . alle Zeichen inklusive Zeilenumbrüche passend zu können. Aber das allein wird dazu führen, dass die Regex-Engine über Bord geht, da Regexes standardmäßig gierig sind. Verwenden Sie \{-} anstelle von * für eine nicht gierige Übereinstimmung alle.

Da der Befehl g/ /d nur eine einzelne Zeile löscht (selbst bei einer mehrzeiligen Übereinstimmung), sollte vorzugsweise zu s///g gewechselt werden (global ersetzen).

:%s/<!--\_.\{-}-->//g

+0

Das hat super funktioniert! Vielen Dank! –

2

Sie sollten XSLT verwenden, um die Datei in eine neue Datei umzuwandeln. Sie verwenden die Identitätstransformation mit einer zusätzlichen Regel, um die Kommentare nicht zu kopieren.

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="comment()"/> 

You „xsltproc“ im libxslt Paket unter Linux verwenden kann dies als ein Skript zu tun, was ich denke, Sie von vim ausführen können.

0

Ich glaube, das sollte funktionieren:

:g/<!--.*?-->/d 

Das Fragezeichen macht das Sternchen „lazy“ statt „gierig“, es so wenig wie möglich wird übereinstimmen bedeutet der Ausdruck zu befriedigen. Dies verhindert, dass die Expression von dem mittleren Teil dieses Beispiels zu entfernen:

We want to keep this<!-- This is a comment -->We also want to keep this<!-- Another comment --> 

EDIT: Sieht aus wie der vim Geschmack von regex nicht *? faul Matching nicht unterstützt. Mein Fehler.

+0

was Multi-Line? – ghostdog74

0

Wenn es nicht zu viel Aufwand ist und Sie auf Ihrem System gawk haben. können Sie versuchen, diese

$ more file 
<!-- 
asdlfj 
sdjf 
;jsgsdgjasl --> 
text i want 
i want 
.... 
<!-- junk junk --> 
i want text 
anthor text 
end 

$ gawk -vRS='-->' '{ gsub(/<!--.*/,"")}1' file 


text i want 
i want 
.... 


i want text 
anthor text 
end 
+0

können Sie bitte die "1" am Ende des Aufrufs gsub() erklären? –

+0

Sie können einen anderen Weg schreiben: gawk -vRS = '->' {gsub (/

+0

da> funktioniert. Kannst du sagen, wie man das durch die Datei wiederholt? –

+0

@ Vijay, sorry Kumpel Ich habe keine Ahnung. Möglicherweise müssen Sie den vorgeschlagenen Original-Regexp verwenden. –