Регулярное выражение для поиска html тега

Модератор: Модераторы разделов

Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Регулярное выражение для поиска html тега

Сообщение Daeloce »

Всем добрый вечер!
Стоит проблема для одной программы на shelle, необходимо найти открытые и закрытые теги. Насколько я понимаю, надо использовать регулярные выражения, но как что-то плохо представляю! Основная проблема в том, что есть два варианта:
<a href=....> в этом случае надо регулярное выражение, которое выдаст <a т.е. от "<" до "пробела". А возможен вариант, когда <br>, т.е. нужно выделить от "<" до ">" . И вот как это реализовать в shell скрипте не понимаю... Может кто подскажет?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
19.05.2009 20:50
<a href=....> в этом случае надо регулярное выражение которое выдаст <a т.е. от "<" до "пробела".

Код: Выделить всё

sed -r 's/<([^>]+)>/Здесь был тег \1 но я его поменяла/' test.html

поменялА, потому что sed - командА ;)
<([^>]+)> Значит:
сначала <
потом 1 или много символов, но только не >
потом >

ЗЫЖ
Это всё в книжке написано(Фридл Дж. - Регулярные выражения. (2003.2.изд)(S))
Хотя мне не очень понравилось - слишком хорошо разжёвано, и с уклоном в perl... Однако читать легче, чем info sed ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

Спасибо большое!:)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Регулярное выражение для поиска html тега

Сообщение sash-kan »

drBatty писал(а):
19.05.2009 20:54

Код: Выделить всё

sed -r 's/<([^>]+)>/Здесь был тег \1 но я его поменяла/' test.html
а если тэг занимает более одной строки?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

sash-kan писал(а):
20.05.2009 02:32
а если тэг занимает более одной строки?

тогда наши действия существенно усложняются.

Код: Выделить всё

sed -r '
:l1
s/<\/tr>|<br(\s+/)?>/&/
tl2
N
bl1
:l2
s/\r?\n/ /g
s/<\/tr>|<br(\s+/)?>/&\n/g
'
вроде что-то типа этого вырезает все переводы строки, и вставляет новые, но только после тегов </tr> и <br>
ну а дальше работаем с тегами... только проверить это надо...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: Регулярное выражение для поиска html тега

Сообщение svary »

Daeloce писал(а):
19.05.2009 20:50
как это реализовать в shell скрипте не понимаю

Вы не одиноки :-) Я тоже - не понимаю. Насколько мне известно, реализовать выделение HTML тегов с помощью регулярных выражений невозможно в принципе. Простейший пример :

Код: Выделить всё

<H1>Заголовок<B>выделение</h1>завершение</b>


Поиск через регулярные выражения даст аж два HTML тега. Хотя, по правилам языка, здесь нет ни одного.
Характерно, что в разных браузерах такая конструкция приведет к разным результатам.
В последенем стандарте HTML (ИМХО) специально оговорена недопустимость такого текста.
Спасибо сказали:
Аватара пользователя
klark
Сообщения: 194
ОС: Gentoo Linux

Re: Регулярное выражение для поиска html тега

Сообщение klark »

sash-kan писал(а):
20.05.2009 02:32
а если тэг занимает более одной строки?

Код: Выделить всё

sed -r 's/$/ /g' test.html | tr -d '\n' | sed -r 's/<([^>]+)>/Здесь был тег (((=\1=))) но я его убрал/g'
Лечите катаракту у офтальмолога, а мне очки не втирайте!
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Регулярное выражение для поиска html тега

Сообщение Voice »

svary писал(а):
20.05.2009 05:47
Насколько мне известно, реализовать выделение HTML тегов с помощью регулярных выражений невозможно в принципе. Простейший пример :

Код: Выделить всё

<H1>Заголовок<B>выделение</h1>завершение</b>


Поиск через регулярные выражения даст аж два HTML тега. Хотя, по правилам языка, здесь нет ни одного.

По правилам это не валидный HTML, так что на такое нормальные люди не обращают внимание. Да и есть заглядывание вперед/назад, который спасет и от этого ;)
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

svary писал(а):
20.05.2009 05:47
Вы не одиноки :-) Я тоже - не понимаю. Насколько мне известно, реализовать выделение HTML тегов с помощью регулярных выражений невозможно в принципе. Простейший пример :
Вы сами написали что это запрещённая конструкция, и поведение браузеров непредсказуемо... Чем скрипт лучше?
svary писал(а):
20.05.2009 05:47
Поиск через регулярные выражения даст аж два HTML тега.

ну да. А что? Мой браузер показывает
Заголовоквыделениезавершение

Код: Выделить всё

[u]Заголовок[b]выделение[/u]завершение[/b]

Код: Выделить всё

<u>Заголовок<b>выделение</u>завершение</b>

2 тега... А ваш? Видимо и регулярное выражение надо составлять таким образом, что-бы оно работало так-же...

klark писал(а):
20.05.2009 05:55

Код: Выделить всё

sed -r 's/$/ /g' test.html | tr -d '\n' | sed -r 's/<([^>]+)>/Здесь был тег (((=\1=))) но я его убрал/g'

ага, спасибо. единственный недостаток - весь текст грузится в память. одной строкой.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

Всем спасибо разобрался и работает!:)
Можно еще вопрос?:)

Есть два файла. Допустим такие:
1 файл:
а
б
а
в

2 файл
б
б
г
а

Нужно удалить из файла одинаковые строки, причем если в первом файле строка "а" встречается 1 раз то из второго файла её надо удалить только один раз. Т.е после должно получиться:
1 файл:
а
в

2 файл:
б
г

Как это сделать?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
20.05.2009 14:19
Как это сделать?

а это думать надо.
могу только подсказать направление
sort --help
uniq --help

после сортировки одинаковые строки будут рядом, вот тут-то вы их и посчитаете, например wc
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Регулярное выражение для поиска html тега

Сообщение sash-kan »

klark писал(а):
20.05.2009 05:55
sed -r 's/$/ /g' test.html | tr -d '\n' | sed -r 's/<([^>]+)>/Здесь был тег (((=\1=))) но я его убрал/g'
а как насчёт обойтись без коверканья файла?
ведь нередко это существенно. например, в файле есть <script>текст скрипта</script>, который в этом случае с высокой вероятностью станет неработоспособен.

drBatty писал(а):
20.05.2009 03:54

Код: Выделить всё

sed -r '
:l1
s/<\/tr>|<br(\s+/)?>/&/
tl2
N
bl1
:l2
s/\r?\n/ /g
s/<\/tr>|<br(\s+/)?>/&\n/g
'
и где здесь «отлов» тэга, занимающего более одной строки?
<tag bla-bla
bla-bla
bla-bla>
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

sash-kan писал(а):
20.05.2009 23:52
и где здесь «отлов» тэга, занимающего более одной строки?
щаз... делаю...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Регулярное выражение для поиска html тега

Сообщение sash-kan »

Daeloce писал(а):
20.05.2009 14:19
Как это сделать?

$ info coreutils operating on sorted files
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

sash-kan писал(а):
20.05.2009 23:52
и где здесь «отлов» тэга, занимающего более одной строки?
<tag bla-bla
bla-bla
bla-bla>

Shell

doc ~/er $echo "<tag bla-bla bla-bla bla-bla> " | sed -rnf htmlpre.sed <tag bla-bla bla-bla bla-bla>

Код: Выделить всё

#!/bin/sed

H
g
s/.*>([^<>]*)$/\1/
t l1
s/.*<([^<>]*)$/<\1/
t l2
$ b l3
x
b

:l1
x
s/[^>]*$//
b l3

:l2
x
s/<[^<]*$//

:l3
s/\s+/ /g
s/\s*(.*)\s*/\1/
s/([^ \n])</\1\n</g
s/ </\n</g
s/>([^ \n])/>\n\1/g
s/> />\n/g
s/./&/p
b
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Регулярное выражение для поиска html тега

Сообщение sash-kan »

drBatty
круто. но я всё ждал элегантного решения (улыбка).
да, да, вот такой я коварный!

Shell

$ cat /tmp/001 lsdkfjkd kdfk< tag bla-bla bla-bla bla-bla > lsdkfjkd < tag bla-bla bla-bla bla-bla >pooioj $ $ # можно так: $ sgrep '"<" .. ">"' /tmp/001 < tag bla-bla bla-bla bla-bla >< tag bla-bla bla-bla bla-bla > $ $ # а можно эдак: $ sgrep -o '\n%r' '"<" .. ">"' /tmp/001 < tag bla-bla bla-bla bla-bla > < tag bla-bla bla-bla bla-bla > $ $ # а можно и вообще разэдак: $ sgrep -o 'start\n%r\nend\n' '"<" .. ">"' /tmp/001 start < tag bla-bla bla-bla bla-bla > end start < tag bla-bla bla-bla bla-bla > end

ведь гораздо элегантнее, согласитесь?
p.s. и это только верхушка айсберга sgrep-а.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

sash-kan писал(а):
21.05.2009 03:09
круто. но я всё ждал элегантного решения (улыбка).

мне этот скрипт нужен чтобы код разбирать. что-бы в одной строке был 1 тег, либо 1 не тег.
ну а затем очень удобно будет обрабатывать такой текст, например комментарии вырежутся так: sed '/<!--/d', а ссылки так sed '/<a href/, /</a>/d', ну и т.д. Второй командой sed уже можно вложенные таблицы обрабатывать, а может и скрипты на Java :)
а sgrep это конечно красиво... и элегантно... но как это прикрутить к разбору HTML я не очень понимаю. Точнее понимаю, но это уже будет не слишком элегантно ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

А есть возможность сделать так чтобы sed выдавал только то что изменил. т.е. например данный скрипт

Код:

sed -nr 's/(<[^>^ ]+)([\ >])/\n\1\n/g /<!--/d p' $1

выводит строку в которой было изменение. Например был тег <a href = "bla-bla"> после выполнения скрипта я вижу
<a
href = "bla-bla">

А хотелось бы только <a. Конечно можно потом выполнить второй запрос к sed и выбрать только те строки где начало тега(я сейчас так и делаю) но это не красиво. Есть ли другой вариант?
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

Еще такой вопрос. Есть строка: target=_top href="http://top.mail.ru/jump?from=713972" rel="nofollow"><img
Т.е. последний тег заканчивается переводом каретки, как написать рег.выражение чтобы его найти? ПРобовал так
sed -nr 's/(<[^>^ ]+)([\ >\n])/\n\1\n/gp'
Но так не работает, тег <img не находится...Как правильно?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
21.05.2009 06:34
А хотелось бы только <a.

ну дык сотрите всё что за <a
s/(<a ).*/\1/
.* значит "любые символы в любых количествах", а sed - жадная, потому сотрёт сколько сможет, здесь - до конца строки.
Daeloce писал(а):
21.05.2009 10:35
Но так не работает, тег <img не находится...Как правильно?

запомните на будущее:
никаких \n в строке sed НЕТУ
\n это конец строки и в строку не входит. Единственное исключение - если вы сами его туда ввели.
вам надо не "перевод строки", а "правая граница строки", это $

Код: Выделить всё

sed s/<img$/<IMG/

только учтите, что некоторые строки могут в конце содержать пробел и\или(для виндовых текстов) \r
потому, если вы конечно предварительно не очистили строки от мусора в конце, вам надо использовать что-то вроде

Код: Выделить всё

sed s/<img[ \t\r]*$/<IMG/

так будет работать...

Daeloce писал(а):
21.05.2009 10:35
переводом каретки

есть "возврат каретки" \r
есть "перевод строки" \n
это совершенно разные символы.
для sed \r - это обычный символ, который ничего не значит. Разве что он вроде входит в метасимвол \s (пустое место)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

Я не совсем правильно выразился. Строка может быть другая! Но смысл что тег может быть в конце. Я конец тега ищу с помощью регулярного выражения ([ >]), а надо в него добавить конец строки. Т.е. тег должен заканчиваться либо " " либо ">" либо концом строки.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
21.05.2009 13:37
Т.е. тег должен заканчиваться либо " " либо ">" либо концом строки.

видимо так
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

Очередной косяк...
Есть файл:

Код:

<HTML> <a bla-bla><img>bla </img> </a> </html>


Пытаюсь из этого получить список тегов с номерами строчек в которых они располагаются.
Вот скрипт которым пытаюсь это сделаь:

Код:

tr A-Z a-z < $1 | sed '=' | sed 'N;s/\n/\t/' | sed -nr 's/([0-9]+\t).*(<[^>^ ]+)( |>|$)/\n\2\t\t\1\n/g /<!--/d /<meta/d p' | sed -nr 's/<([^>^ ]+)(\t\t[0-9]+)/\1\2/pg'


Но если в строке есть два тега, а в приведенном примере например есть строка : <a bla-bla><img>bla данный скрипт возвращает только последний тег. Т.е результат работы скрипта выглядит так:

Код:

html 1 img 2 /img 3 /a 4 /html 5


А хотелось чтобы был такой:

Код:

html 1 a 2 img 2 /img 3 /a 4 /html 5


Что надо поправить в скрипте чтобы он выдавал все теги в строке?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
23.05.2009 12:01
А хотелось чтобы был

лень объяснять... это у мну на форуме вроде написано...

Код: Выделить всё

H
/</ {
    s/.*//
    x
    s/\r/ /
    s/\s+/ /g
    s/ ?([<>]) ?/\1/g
    s/<[^>]*/\n&/g
    s/^\s*(.*) ?$/\1/
    p
}
Daeloce писал(а):
23.05.2009 12:01
tr A-Z a-z
это вы зря...

Daeloce писал(а):
23.05.2009 12:01
/<!--/d
/<meta/d

и это тоже...
Daeloce писал(а):
23.05.2009 12:01
\t\t

это 2 табуляции... в HTLM вроде все пробельные символы эквивалентны... причём даже любые непрерывные группы, даже непрерывные группы, с комментами, даже группы с комментами и с тегами в комментах...

А пробельный символ это \s
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

drBatty писал(а):
23.05.2009 19:16
[
Daeloce писал(а):
23.05.2009 12:01
tr A-Z a-z
это вы зря...

Daeloce писал(а):
23.05.2009 12:01
/<!--/d
/<meta/d

и это тоже...

Почему? Я пишу скрипт который найдет незакрытые теги. У мета тегов нету закрывающих тегов. А комментарии вообще к тегам не относятся.
drBatty писал(а):
23.05.2009 19:16
Daeloce писал(а):
23.05.2009 12:01
\t\t

это 2 табуляции... в HTLM вроде все пробельные символы эквивалентны... причём даже любые непрерывные группы, даже непрерывные группы, с комментами, даже группы с комментами и с тегами в комментах...

А пробельный символ это \s


Табуляции рисую чисто для себя. Тот скрипт который я пишу должен вывести не закрытые теги. А sed лишь подготавливает файл для работы с ним, а именно выделяет теги и добавляет номера строк где они были!
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

Видимо я не правильно объяснил... Написать скрипт который разрежет строчку на отдельные теги я могу, но мне надо к ним еще добавить номер строки в котором онм были. А вот этого не получается...
Давайте я на примере покажу что делаю, что получается и что хочу чтобы получилось.

Есть файл, и в нем допустим есть 9 строка следующего вида:
<a href=''>bla-bla-bla</a>bla<img>
Сначала я добавляю к этой строчке её номер командами: sed '=' | sed 'N;s/\n/\t/' в итоге получаю:
9 <a href=''>bla-bla-bla</a>bla<img>
Теперь я хочу чтобы каждый тег(именно имя тега и слеш(если есть) вначале, без параметров типа href='', и без скобок) начинался с новой строки и к нему был добавлен номер строки где он был(в нашем случае 9). Я пытаюсь сделать это командой sed -nr 's/([0-9]+\t).*(<[^>^ ]+)( |>|$)/\n\2\t\t\1\n/gp'. Но в ответ получаю только:
img 9
А надо чтобы еще и первые два тега(в данном случае два в реальности их может быть сколько угодно) с номерами строчек были на новых строчка. Т.е. надо чтобы из этой строчки получилось следующее:
a 9
/a 9
img 9
Можете помочь исправить команду так чтобы она выводила все теги с номерами строчек а не только последний?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Регулярное выражение для поиска html тега

Сообщение sash-kan »

Daeloce писал(а):
23.05.2009 12:01
Есть файл:

Код:

<HTML> <a bla-bla><img>bla </img> </a> </html>

Shell

$ sgrep -o "%r\t%i\t%j\n" '"<" __ (">" or BLANK)' /ваш/файл HTML 1 4 a 8 8 img 19 21 /img 28 31 /a 35 36 /html 40 44 $ sgrep -o "%r\t%i\t%j\n" '"<" .. (">" or BLANK)' /ваш/файл <HTML> 0 5 <a 7 9 <img> 18 22 </img> 27 32 </a> 34 37 </html> 39 45
позиции начала и конца — в байтах.

p.s. это я так, для иллюстрации.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
23.05.2009 19:38
Почему? Я пишу скрипт который найдет незакрытые теги. У мета тегов нету закрывающих тегов. А комментарии вообще к тегам не относятся.

потому-что команда d делает 2 вещи: очищает буфер и запрещает вывод. так как у вас ключ -n, то можно просто выйти на таких строках

Код: Выделить всё

/<!--|<meta/b

и как обработается такое?
<!-- comm --> <a
href=...
Мой скрипт не только режет, но ещё и клееит строки -
из

Код: Выделить всё

<
f
f>
g
<
ff
f
>
получается

Код: Выделить всё

<ff>g
<ff f>

сами попробуйте :)
Daeloce писал(а):
23.05.2009 20:09
Можете помочь исправить команду так чтобы она выводила все теги с номерами строчек а не только последний?

я бы сделал так:
1) добавил перед каждой строчкой с < номер строки
2)вставил-бы номер перед < (перед номером надо поставить нецифру, чтоб потом не запутаться.
3)разрезал и склеил строки так, что-бы в одной строке был бы 1 тег
4)перенёс номер из прошлой строки в следующую
проблема в том, что sed не умеет вставлять номер строки в текст. было бы круто написать что-то вроде

Код: Выделить всё

sed 's/^/NUMBER_LINE\t/

поэтому приходится извращатся -

Код: Выделить всё

$ sed '=' tst.html | sed -rn 'N; s/</|</g
:l
s/([0-9]+)\n(.*)([^0-9])</\1\n\2\3\1</
t l
s/[0-9]+\n//p'

это для любого HTML подойдёт
тут я из < делаю |номер строки<
но зачем знать номер строки? ведь для HTML это неважно!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Daeloce
Сообщения: 62
ОС: OpenSUSE 11.0 Ubuntu 9.04

Re: Регулярное выражение для поиска html тега

Сообщение Daeloce »

drBatty писал(а):
24.05.2009 16:47

Код: Выделить всё

$ sed '=' tst.html | sed -rn 'N; s/</|</g
:l
s/([0-9]+)\n(.*)([^0-9])</\1\n\2\3\1</
t l
s/[0-9]+\n//p'

это для любого HTML подойдёт
тут я из < делаю |номер строки<
но зачем знать номер строки? ведь для HTML это неважно!


Большое спасибо работает!:)

Надо это для того чтобы когда скрипт вывел список не закрытых тегов было видно в каких они строчках для того чтобы их найти. Вот первая версия(работающая по задуманной схеме, пусть и имеющая некоторые ограничения на html файл):

Код:

#!/bin/bash tr A-Z a-z < $1 | sed '=' | sed -rn 'N; s/</|</g :l s/([0-9]+)\n(.*)([^0-9])</\1\n\2\3\1</ t l s/[0-9]+\n//p' | sed -nr 's/([0-9]+|)(<[^>^ ]+)( |>|$)/\n\2\t\1\n/g /<!--/d /<meta/d p' | sed -nr 's/<([^>^ ]+)(\t[0-9]+)/\1\2/pg' > /tmp/htman.tmp rm /tmp/opentag.tmp touch /tmp/opentag.tmp while read LINE; do TAG=`echo $LINE | sed -r 's/([^(0-9)]+)([0-9]+)/\1/'` slash=${TAG:0:1} linewf=${TAG:1} if [ $slash != "/" ]; then echo $LINE >> /tmp/opentag.tmp echo $LINE >> /tmp/test else LASTLINE=`sed -n '$p' /tmp/opentag.tmp` LASTTAG=`echo $LASTLINE | sed -r 's/([^0-9]+)([0-9]+)/\1/'` while [ "$LASTTAG" != "$linewf" ] do if [ `wc -l /tmp/opentag.tmp | awk '{print $1}'` = 0 ]; then break; fi echo $LASTLINE sed '$d' /tmp/opentag.tmp > /tmp/opentag1.tmp mv /tmp/opentag1.tmp /tmp/opentag.tmp LASTLINE=`sed -n '$p' /tmp/opentag.tmp` LASTTAG=`echo $LASTLINE | sed -r 's/([^0-9]+)([0-9]+)/\1/'` done sed '$d' /tmp/opentag.tmp > /tmp/opentag1.tmp mv /tmp/opentag1.tmp /tmp/opentag.tmp fi done < /tmp/htman.tmp cat /tmp/opentag.tmp rm /tmp/opentag.tmp rm /tmp/htman.tmp

Написан ужасно я знаю! :blush:. Но это первый мой скрипт на shell'e поэтому сильно не пинайте!:)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Регулярное выражение для поиска html тега

Сообщение drBatty »

Daeloce писал(а):
24.05.2009 17:59
Написан ужасно я знаю!

да ладно, лишь-бы работал :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: