2009-11-12 27 views
7

Come si eliminano i commenti in XML?Vim - Eliminazione di commenti XML

Se i tag di apertura e di commento di chiusura sono sulla stessa riga, utilizzare :g/^<!--.*-->$/d per eliminare il commento. Come eliminare i commenti che sono distribuiti su più righe?

risposta

17

\_. invece di . permette corrispondenza su tutti i personaggi, tra cui nuove righe. Ma questo da solo causerà il regex del motore di andare fuori bordo dal momento che le regex sono avide di default. Usa \{-} invece di * per una partita non avara tutti.

Poiché il comando g/ /d elimina una sola riga (anche per una corrispondenza multilinea), sarebbe preferibile passare a s///g (sostituzione globale).

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

+0

Questo ha funzionato alla grande! Grazie! –

2

È necessario utilizzare XSLT per trasformare il file in un nuovo file. Si utilizza la trasformazione dell'identità con una regola aggiuntiva per non copiare sui commenti.

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

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

È possibile utilizzare "xsltproc" nel pacchetto libxslt su Linux per fare questo come uno script che immagino è possibile eseguire da vim.

0

Credo che questo dovrebbe funzionare:

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

Il punto interrogativo rende l'asterisco "pigro" invece di "greedy", il che significa che abbinerà il meno possibile per soddisfare l'espressione. Questo impedisce l'espressione di rimuovere la parte centrale di questo esempio:

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

EDIT: Sembra che il sapore di regex vim non supporta *? corrispondenza artificiale. Colpa mia.

+0

che dire multilinea? – ghostdog74

0

se non è troppo di una seccatura e hai gawk sul tuo sistema. si può provare questo

$ 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

puoi spiegare il "1" alla fine della chiamata a gsub()? –

+0

puoi scrivere in un altro modo: gawk -vRS = '->' '{gsub (/

+0

da> funziona. Puoi dire come ripeterlo attraverso il file? –

+0

@ Vijay, scusa amico, non ne ho idea. Potrebbe essere necessario utilizzare la regexp originale suggerita. –

Problemi correlati