удалить теги комментариев html, используя регулярное выражение

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

Я пытаюсь удалить комментарий с помощью sed:

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

Не работает :( Что я делаю не так?

Большое спасибо за Вашу помощь!


person Zenet    schedule 29.10.2010    source источник
comment
возможно: /<!--[.\s\S]*?-->/   -  person drudge    schedule 30.10.2010
comment
@jnpcl: это похоже на Perl. Это не будет работать в sed.   -  person Dennis Williamson    schedule 30.10.2010
comment
Применяются обычные предупреждения.   -  person Dennis Williamson    schedule 30.10.2010
comment
@Dennis: Это сработало для меня с RegExPal, я не знал, что sed использует другой синтаксис для регулярных выражений. .   -  person drudge    schedule 01.11.2010


Ответы (3)


patrickmdnet имеет правильный ответ. Здесь это в одной строке с использованием расширенного регулярного выражения:

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

Вот хороший ресурс для получения дополнительной информации о sed. Этот sed является адаптацией однострочника № 92.

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

person Brian Clements    schedule 29.10.2010
comment
Спасибо Брайан! Ты молодец :) что означает :a в твоей команде sed? - person Zenet; 30.10.2010
comment
Он создает метку ветви с именем «a». '//ba' в конце разветвляется на 'a'. - person Brian Clements; 30.10.2010
comment
Нужен ли // перед ba? Мне это не нужно в GNU sed. - person Dennis Williamson; 30.10.2010
comment
Двойная косая черта является сокращением для предыдущего выражения (то есть /‹!--/). Это то, что определяет, будет ли выполнена ветвь (чтобы вернуться назад и захватить больше строк в буфер, если это необходимо). Я бы предположил, что без него ветка всегда берется и весь файл читается в один буфер. Может быть проблема с очень большим файлом, я не уверен. - person Brian Clements; 30.10.2010

Одна проблема с вашей первоначальной попыткой заключается в том, что ваше регулярное выражение обрабатывает только комментарии, которые полностью находятся в одной строке. Кроме того, начальный и конечный «.*» удалит текст, не являющийся комментарием.

Вам лучше использовать существующий код, а не создавать свой собственный.

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/<!--.*-->//

(из http://sed.sourceforge.net/grabbag/scripts/)

См. эту ссылку для различных способов использования модулей perl для удаления комментариев HTML (используя Regexp::Common, HTML::Parser или File::Comments). Я уверен, что есть методы, использующие другие утилиты.

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

person patrickmdnet    schedule 29.10.2010

Я думаю, вы можете сделать это с помощью awk, если хотите. Начинать:

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

An HTML style comment 

-->

Some other text

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

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

Результат 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>
person eldarerathis    schedule 29.10.2010
comment
удаляет, например, всю следующую строку. Не только комментарий: ‹meta charset=utf-8› ‹!-- кодировка должна быть в пределах первых 1024 байт документа --› - person john-jones; 01.04.2020