2010-10-29 16 views
4
This is how my text (html) file looks like 
    <!-- 
    |        | 
    | This is a dummy comment  | 
    |  please delete me   | 
    |   asap     | 
    |        | 
     ________________________________ 
    | --> 

    this is another line 
    in this long dummy html file... 
    please do not delete me 

J'essaie de supprimer le commentaire en utilisant sed:suppression des balises de commentaire HTML en utilisant regexp

cat file.html | sed 's/.*<!--\(.*\)-->.*//g' 

Il ne fonctionne pas :(Qu'est-ce que je fais mal

Je vous remercie? !. pour votre aide

+1

peut-être: '/ /' – drudge

+1

@jnpcl: Cela ressemble à Perl. Cela ne marchera pas dans 'sed'. –

+2

Les [avertissements habituels] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) s'appliquent. –

Répondre

9

patrickmdnet a la bonne réponse. Ici, il est sur une ligne en utilisant regex étendu:

cat file.html | sed -e :a -re 's/<!--.*?-->//g;/<!--/N;//ba' 

Voici une bonne ressource pour en savoir plus sur sed. Ce sed est une adaptation d'une doublure # 92

http://www.catonmat.net/blog/sed-one-liners-explained-part-three/

+0

Merci Brian! Vous êtes génial :) qu'est-ce que le: un signifie dans votre commande sed? – Zenet

+0

Crée une étiquette de branche nommée 'a'. Le '// ba' à la fin se ramifie à 'a'. –

+0

Est-ce que le '//' avant que 'ba' soit nécessaire? Je n'en ai pas besoin dans GNU 'sed'. –

3

Je pense que vous pouvez le faire avec awk si vous souhaitez démarrer:

[~] $ more test.txt 
<!-- 

An HTML style comment 

--> 

Some other text 

<div> 
<p>blah</p> 
</div> 

<!-- Whoops 
    Another comment --> 
<span>Something</span> 

Résultat du awk:

[~]$ cat test.txt | awk '/<!--/ {off=1} /-->/ {off=2} /([\s\S]*)/ {if (off==0) print; if (off==2) off=0}' 
Some other text 

<div> 
<p>blah</p> 
</div> 

<span>Something</span> 
7

Un problème avec votre tentative originale est que votre regex ne gère que les commentaires qui sont tout à fait sur une seule ligne. De plus, les mentions ". *" Précédant et suivant supprimeront le texte sans commentaire.

Vous feriez mieux d'utiliser le code existant au lieu de rouler le vôtre.

http://sed.sourceforge.net/grabbag/scripts/strip_html_comments.sed

#! /bin/sed -f 
# Delete HTML comments 
# i.e. everything between <!-- and --> 
# by Stewart Ravenhall <[email protected]> 

/<!--/!b 
:a 
/-->/!{ 
    N 
    ba 
} 
s/<!--.*-->// 

(de http://sed.sourceforge.net/grabbag/scripts/)

Voir ce lien pour différentes façons d'utiliser les modules Perl pour supprimer les commentaires HTML (en utilisant Regexp :: Common, HTML :: Parser, ou un fichier :: Commentaires.) Je suis sûr qu'il existe des méthodes utilisant d'autres utilitaires.

http://www.perlmonks.org/?node_id=500603