LINUX.ORG.RU

Удаление html комментариев sed'ом

 ,


0

2
<html><head><title>some page
</title>
<!--любой текст, заметки
куски разметки<table>
</table> и т.д.
-----!>
</head>
<body>
text
<!-- tuturu --!>
</body></html>

как из примера удалить блок <!--*--!> при помощи sed?

upd: мой косяк в примере, комментарии в html <!-- -->

perl -pe 's/<!--.*?--!>//g'

Экранируешь сам надеюсь.

xtraeft ★★☆☆ ()
Ответ на: комментарий от xtraeft

не робит
экранируется тут только "?"?
и почему perl, мне надо sed

Zhopin ()
Ответ на: комментарий от Zhopin

Нет не только (знак вопроса кстати экранировать не надо).
Потому что сед не умеет нежадность.

xtraeft ★★☆☆ ()
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

Потому что сед не умеет нежадность.

Причем тут жадность и sed? sed парсит построчно, а тут нет нескольких комментариев на одной строке. Проблема другого рода — sed не умеет многострочные регэкспы. Без использования hidden buffer не получится.

iVS ★★★★★ ()
Ответ на: комментарий от iVS

Сед даже построчно не умеет нежадность без костылей.

xtraeft ★★☆☆ ()
Ответ на: комментарий от xtraeft

man sed

*
    Matches a sequence of zero or more instances of matches for the preceding regular expression, which must be an ordinary character, a special character preceded by \, a ., a grouped regexp (see below), or a bracket expression. As a GNU extension, a postfixed regular expression can also be followed by *; for example, a** is equivalent to a*. POSIX 1003.1-2001 says that * stands for itself when it appears at the start of a regular expression or subexpression, but many nonGNU implementations do not support this and portable scripts should instead use \* in these contexts.
\+
    As *, but matches one or more. It is a GNU extension.
\?
    As *, but only matches zero or one. It is a GNU extension.

sed uses the posix basic regular expression syntax. According to the standard, the meaning of some escape sequences is undefined in this syntax; notable in the case of sed are \|, \+, \?, \`, \', \<, \>, \b, \B, \w, and \W
perl -pe 's/\<!--.\*?--!\>//g'
не робит

Zhopin ()
Ответ на: комментарий от Zhopin

На какой хрен ты * экранируешь, а точку например нет? И где в man sed аналог .*?

xtraeft ★★☆☆ ()
Последнее исправление: xtraeft (всего исправлений: 1)
Ответ на: комментарий от xtraeft

откуда мне знать что точку нужно экранировать? это прописная истина? где это кстати в мане?

.
    Matches any character, including newline. 
и пример использования s/./a/g
С экранирование точки тоже не робит. Мб будет правильный вариант?

Zhopin ()
Ответ на: комментарий от Zhopin

Я сейчас не за компьютером, позже напишу правильный.
И извини, я ошибся, точку тут экранировать не надо.

xtraeft ★★☆☆ ()
Ответ на: комментарий от Zhopin

Я фигню посоветовал, тут же многострочные комменты. Прошу прощения.

xtraeft ★★☆☆ ()
Ответ на: комментарий от deterenkelt

ух ё, да проще стандартными средствами шела влоб решить
посимвольно парсить текст и писать в вывод. Как тока наберётся совпадение с «<!--» отрубить выхлоп, продолжая парсить, как только наберётся "--!>" возобновить выхлоп.
на сед же должно быть чонить по красивее

Zhopin ()
Ответ на: комментарий от Zhopin

НУ это был образцовый «пуленепробиваемый» вариант. Если вложенных конструкций не предвидится, а нужно вего лишь обычный многострочный комментарий, то можно и проще. Щас, накостыляю чего-нибудь.

deterenkelt ()
Ответ на: комментарий от deterenkelt

Если комментарий расположен строго на строках, где кроме него больше никого нет и внутри комментария 「-->」 не встречается, то

$ echo -e 'pre-line\noprst <!--eklmn\ncomment body\n#2\nend of comment --> something else\npost-line' \
| sed -r '/<!--/,/-->/d'
pre-line
post-line
Если же комментарий может быть встроен в текст, но при этом гарантируется, что на одной строке двух комментариев быть не может, то можно сделать так
echo -e 'pre-line\noprst <!--eklmn\ncomment body\n#2\nend of comment --> something else\npost-line' \
| sed -r '/<!--/,/-->/ {               # Между этими двумя паттернами
              s/<!--[^>]*-?-?>?$//     # На найденной строке удаляем справа от <!--
              n                        # Подаём следующую строку в pattern space
          :be s/.*-->//; t             # Комментарий заканчивается на строке? Тогда на выход.
              s/.*//                   # Иначе удаляем строку.
              N; b be                  # Присоединяем следующую строку в pattern space, и снова ищем, где кончится комментарий.
          }'
pre-line
oprst 
 something else
post-line

deterenkelt ()
Ответ на: комментарий от sdio

А разве оно не съест все между первым и последним комментарием и сработает с многострочными?

xtraeft ★★☆☆ ()

awk подойдёт?

awk '/<!--/,/--!>/ {next}1' old.html > new.html
Deleted ()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от deterenkelt

Чуть-чуть подправил.

$ echo -e 'pre-line
<!--one-liner comment-->
ohoho I’m between comments!
text before one-liner<!--one-liner numba 2--> text after one-liner
yohoho I’m between comments!
text before multiline comment <!--comment to the right
comment body
still body
end of comment --> text after multiline comment
post-line' | sed -r 's/<!--[^>]*-->//g;         # Удаляем inline сомментарии заранее
                     /<!--/,/-->/ {
                         s/<!--[^>]*$//; n
                     :be s/.*-->//; t
                         s/.*//
                         N; b be
                     }'
pre-line

ohoho I’m between comments!
text before one-liner text after one-liner
yohoho I’m between comments!
text before multiline comment 
 text after multiline comment
post-line

deterenkelt ()
Ответ на: комментарий от deterenkelt

Что-то я протупил, можно же проще

sed -r '/<!--/,/-->/{ :be s/<!--[^>]*-->//;t;N; b be}'

deterenkelt ()
Ответ на: комментарий от sdio

пашет чёрт возьми
спасибо
тока вот как это работает?

Zhopin ()
Ответ на: комментарий от Zhopin

тока вот как это работает?

Тебе уже выше намекнули, что оно работает правильно только с мультилайновыми, а между однострочниками херит текст.

какое сильное колдунство

Я думал, после комментариев выше, объяснять уже не надо.

deterenkelt ()
Ответ на: комментарий от deterenkelt

Однострочные комментарии вырезаем обычным способом.

sed -е 's/<!--.*--!>//' -е '/<!--/,/--!>/d'
sdio ★★★★★ ()
Ответ на: комментарий от deterenkelt

извиняюсь, я проглядел пост с комментариями
спасибо

Zhopin ()
Ответ на: комментарий от Zhopin

проглядел пост с комментариями

У меня сейчас в голове комментатор проорал:
 — Zhopin выходит на финишную прямую, тема решена, и-и-и… ЛОР снова подтверждает свой титул форума для слепых! По-бе-да!!! Ура, товарищи!
*оглушительный рёв трибун*

deterenkelt ()
Ответ на: комментарий от sdio

Это всё что ты можешь сказать?

Ещё могу сказать, что таких комментариев

<!--.*--!>

В HTML не бывает, а

/<!--/,/--!>/d

съест вместе с комментарием те части строк, что были слева от его начала и справа от его закрытия.

deterenkelt ()
Ответ на: комментарий от deterenkelt

s/<!--[^>]*-->//

[^>] — так нельзя. В каментах часто куски кода (html тегов).

sdio ★★★★★ ()
Ответ на: комментарий от deterenkelt

В HTML не бывает, а

Всмысле воскл. знак здесь "--!>" ? Ну так ТС так написал, мне то что?

съест вместе с комментарием

Многострочные комментарии как правило не смешивают с кодом (разметкой), однострочные, да, могут.

sdio ★★★★★ ()
Ответ на: комментарий от deterenkelt

Сделал, молодец! Давай без нравоучений или быстро и решительно ПНХ.

sdio ★★★★★ ()
Ответ на: комментарий от sdio

Сделал, молодец! Давай без нравоучений или быстро и решительно ПНХ.

Давай не крути барабан, а назови слово сразу, чтоб мне далеко ходить не пришлось :^)

deterenkelt ()
Ответ на: комментарий от deterenkelt

deterenkelt sdio ну вообще ожидал что тут постов 20ть будут чмырить меня, какой я лошара, что не знаю даже седа. Но на моё удивление все так пытались помочь и вообщем сильно помогли. Лор уже не тот) Cпасибо вам.

Насчёт коментов, да, мой косяк, так что не ругайтесь, оба правы.

Zhopin ()
Ответ на: комментарий от deterenkelt

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

Zhopin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.