LinuxForum.Fans
Тема

Подскажите по регулярному выражению

Автор: valet 36 сообщений 5105 просмотров
#106988
drBatty написал:
это что ещё такое? sed разве такое понимает?

Я сейчас вдали от дома, от любимых книжек, полагаюсь только на знания топикстартера, собственную, увы, слабую память и на беглый просмотр man sed. :o

#106991
Lupo Alberto написал:
Как я понимаю, изменения нужно вносить в третье поле. Попытайтесь мне объяснить, как оно должно выглядеть.

Выглядеть оно должно так:

text
=\'news-id-1147856171\'><!--TBegin--><a href=\"http://newfilms.org.ua/go/?http://www.binmovie.org/uploads/posts/2008-11/1226772395_1.jpg\" onClick=\"return hs.expand(this)\" ><img align=\"left\" src=\"http://www.binmovie.org/uploads/posts/2008-11/thumbs/1226772395_1.jpg\" style=\"border: none;\" alt=\'Кровавая расплата / Grave Misconduct (2008) DVDRip(700Mb)\' title=\'Кровавая расплата / Grave Misconduct (2008) DVDRip(700Mb)\'  /></a><!--TEnd--><u>Информация о фильме</u><br /><b>Название:</b> Кровавая расплата<br /><b>Оригинальное название:</b> Grave Misconduct<br /><b>Год выхода:</b> 2008<br /><b>Жанр:</b>  Триллер, драма<br /><b>Режисер:</b> Арман Мастрояни / Armand Mastroianni<br /><b>В ролях:</b> Фран Беннетт, Кристал Бернард, Чарити Бейер, Эдвард Карневале, Майкл Коул, Мерседес Колон, Джон Флек, Дориан Хэрвуд, Роксанна Харт, Джек Кандел<br /><b>Кол...во CD|Тип: </b> 1х700 Mb<br /><b>Количество частей: </b> 7<br /><b>Залито на: </b> 4files.net, vip-file.com, sms4file.com, letitbit.net<br /><b>Зеркала: </b> rapidshare.com<br /><br /><b>О фильме: </b><br />Джулия — начинающий автор, у нее контракт с издательством и серьезные проблемы. Издатель требует результатов, а у нее творческий кризис, она никак не может написать ни строчки. Именно в это время близкая подруга дает ей рукопись триллера с просьбой прочитать и оценить роман. Читая, Джулия понимает — это бестселлер. Не успев вернуть рукопись, Джулия узнает о внезапной смерти подруги. И вот тут, под давлением обстоятельств, она совершает необдуманный поступок — выдает чужое произведение за свое собственное. В итоге издатель получает хит сезона, а автор купается в лучах славы. Но какой же неописуемый ужас овладевает Джулией, когда события, описанные в книге, начинают происходить в реальной жизни. И с каждым днём количество жертв растет, а убийца уже в нескольких шагах от нее самой.', '', 'Кровавая расплата / Grave Misconduct (2008) DVDRip(700Mb) </div>', '', '', '10', 'krovavajа-rasplata-grave-misconduct-2008-dvdrip700mb-', 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, '', '0000-00-00', '', 1, '', '', '', 0, ''),
=\'news-id-1147856170\'><!--TBegin--><a href=\"http://newfilms.org.ua/go/?http://www.binmovie.org/uploads/posts/2008-11/1226772244_1.jpg\" onClick=\"return hs.expand(this)\" ><img align=\"left\" src=\"http://www.binmovie.org/uploads/posts/2008-11/thumbs/1226772244_1.jpg\" style=\"border: none;\" alt=\'Функ / Phoonk (2008) DVDRip(700Mb)\' title=\'Функ / Phoonk (2008) DVDRip(700Mb)\'  /></a><!--TEnd--><u>Информация о фильме</u><br /><b>Название:</b> Функ<br /><b>Оригинальное название:</b> Phoonk<br /><b>Год выхода:</b> 2008<br /><b>Жанр:</b>  Ужасы, триллер<br /><b>Режисер:</b> Рам Гопал Варма<br /><b>В ролях:</b> Ану Ансари, Шрей Бава, Ахсаас Чанна, Кенни Десаи, Лиллет Дюбей, Закир Хуссэйн, Кишоре Кадам, Барат Каул, Ашвини Халсекар.<br /><b>Кол...во CD|Тип: </b> 1х700 Mb<br /><b>Количество частей: </b> 8<br /><b>Залито на: </b> 4files.net, vip-file.com, sms4file.com, letitbit.net<br /><b>Зеркала: </b> rapidshare.com<br /><br /><b>О фильме: </b><br />Фильм рассказывает нам историю убежденного атеиста, чье представление о мире рушится после странных событий. Его близкие подвергаются воздействию совершенно неведомых сил, само существование которых Функ объяснить не может. Вторая героиня фильма, напротив, отворачивается от Бога после произошедшего с нею несчастного случая.</div>', '', '', '10', 'funk-phoonk-2008-dvdrip700mb-', 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, '', '0000-00-00', '', 1, '', '', '', 0, ''),
=\'news-id-1147856164\'><!--TBegin--><a href=\"http://newfilms.org.ua/go/?http://www.binmovie.org/uploads/posts/2008-11/1226771715_1.jpg\" onClick=\"return hs.expand(this)\" ><img align=\"left\" src=\"http://www.binmovie.org/uploads/posts/2008-11/thumbs/1226771715_1.jpg\" style=\"border: none;\" alt=\'Космос: Территория смерти / Dead Space: Downfall (2008) BDRip 720p\' title=\'Космос: Территория смерти / Dead Space: Downfall (2008) BDRip 720p\'  /></a><!--TEnd--><u>Информация о фильме</u><br /><b>Название:</b> Космос: Территория смерти<br /><b>Оригинальное название:</b> Dead Space: Downfall<br /><b>Год выхода:</b> 2008<br /><b>Жанр:</b> Ужасы, триллер, мультфильм<br /><b>Режисер:</b> Чак Паттон<br /><b>Кол...во CD|Тип: </b> 1х2.54 GB<br /><b>Количество частей: </b> 15<br /><b>Залито на: </b> 4files.net, vip-file.com, sms4file.com, letitbit.net<br /><b>Зеркала: </b> rapidshare.com<br /><br /><b>О фильме: </b><br />Приквел одной из самых долгожданных игр 2008 года. Бороздящий космические просторы горно-исследовательский корабль «Ишимура» натыкается на загадочную чужеродную Метку (Артефакт), обозначающую особую зону. Команда амбициозного экипажа уверена, что они обнаружили подтверждение существования наших создателей. Но…исследование и смещение Метки высвобождает НЕЧТО, относящиеся к инопланетному виду, которое долгое время было погребено на заброшенной отдаленной планете. Группа горняков и члены космического экипажа вынуждены вступить в отчаянную борьбу за выживание с МОНСТРОМ, с которым человечество доселе не сталкивалось.</div>', '', 'Космос: Территория смерти / Dead Space: Downfall (2008) BDRip 720p ', '', '', '10', 'kosmos-territorijа-smerti-dead-space-downfall-2008-bdrip-720p-', 0, 1, 1, 1, 1, 0, 3, 1, 1, 0, 0, '', '0000-00-00', '', 1, '', '', '', 0, ''),
=\'news-id-1147856161\'><!--TBegin--><a href=\"http://newfilms.org.ua/go/?http://www.binmovie.org/uploads/posts/2008-11/1226770423_1.jpg\" onClick=\"return hs.expand(this)\" ><img align=\"left\" src=\"http://www.binmovie.org/uploads/posts/2008-11/thumbs/1226770423_1.jpg\" style=\"border: none;\" alt=\'Постал / Postal (2007) DVD9 Лицензия!\' title=\'Постал / Postal (2007) DVD9 Лицензия!\'  /></a><!--TEnd--><u>Информация о фильме</u><br /><b>Название:</b> Постал<br /><b>Оригинальное название:</b> Postal<br /><b>Год выхода:</b> 2007<br /><b>Жанр:</b> Ужасы, боевик, триллер, комедия<br /><b>Режисер:</b> Уве Болл<br /><b>В ролях:</b> Зак Уорд, Дэйв Фоли, Крис Коппола, Джеки Тон, Дж.К. Симмонс, Ральф Мюллер, Верн Троер, Крис Спенсер, Ларри Томас, Майкл Паре<br /><b>Кол...во CD|Тип: </b> DVD9<br /><b>Количество частей: </b> 3+81<br /><b>Залито на: </b> 4files.net, vip-file.com, sms4file.com, letitbit.net<br /><b>Зеркала: </b> rapidshare.com<br /><br /><b>О фильме: </b><br />В основе фильма одноименная компьютерная игра Postal, главным героем которой является безжалостный убийца.</div>', '', 'Постал / Postal (2007) DVD9 Лицензия! ', '', '', '10', 'postal-postal-2007-dvd9-licenzijа!-', 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, '', '0000-00-00', '', 1, '', '', '', 0, ''),
#106994
drBatty написал:
Это означает, что нужно найти строчки, которые НЕ содержат /regex1/ и для них выполнить команду s///.

А мне наоборот надо работать с теми строчками, которые содержат /regex1/, просто уже их специфически обработать, удалить все, кроме шаблона, которые еще надо подумать как задать.

Если словами, то приблизительно так
<div id=..newsтут много другого текста, потом опять<div id=..newsопять какой-то текст<b>О фильме: </b>описание фильма до<br />здесь много разного текста с тегами, который надо удалять и концовка строки, которую нужно оставить - это </div>', '', '', '10', 'krovavajа-rasplata-grave-misconduct-2008-dvdrip700mb-', 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, '', '0000-00-00', '', 1, '', '', '', 0, ''),
Жирным - то, что надо удалять.

#106995
drBatty написал:
valet, для вашей задачи нужно сделать следующее:

1) сохранить строчку командой h
2)отрезать кусок "между первым и вторым div", и оставить его как есть, а всё что за ним - стереть.
3) сделать обмне буферов x
4) теперь стираем от начала и до второго div
5) производим все замены для хвоста.
6) осталось соединить голову и хвост. Голова у нас сейчас в holdspace, а хвост в буфере:

H
g
s/\n/ /

7) PROFIT в общем-то.

С этого честно говоря вообще ничего не понял :(

#106996

valet, а что именно вы удалили? Файлы не совсем удобные для просмотра на маленьком экране. oO

#106998

Удалил все, что после <b>О фильме: </b>описание фильма<br />, начиная с <br /> и до последнего в строке </div>.

Кстати, да, это можно использовать как правило, то есть до последнего в строке </div>.

#107001
drBatty написал:
Сложнее, если regex не из одного символа. Но нам ведь надо просто удалять то, между чем у нас regex?
Огородим все вхождения символам \n и \r

s/regex/\n&\r/g

теперь имеем:
...\nZ\r...\nZ\r...\nZ\r...
ну и собственно удаление:

s/\r[^\n]*\n//g
s/.*\n//
s/\r.*//

Конечно текст надо предварительно очистить от \r (или выбрать любой другой символ, которого быть не может. Можно невозбранно позаимствовать этот например wink ♥

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

#107008
valet написал:
[quote=drBatty]valet, для вашей задачи нужно сделать следующее:

1) сохранить строчку командой h
2)отрезать кусок "между первым и вторым div", и оставить его как есть, а всё что за ним - стереть.
3) сделать обмне буферов x
4) теперь стираем от начала и до второго div
5) производим все замены для хвоста.
6) осталось соединить голову и хвост. Голова у нас сейчас в holdspace, а хвост в буфере:

H
g
s/\n/ /

7) PROFIT в общем-то.

С этого честно говоря вообще ничего не понял :([/quote]

ну...
я целый учебник на эту тему написал... Но вот коротко:

В sed все операции проходят с использованием буфера. Сначала туда загружается строчка, потом она редактируется, а потом она выгружается (в другой файл).

Но кроме этого основного буфера есть и дополнительный. Если я правильно понял вашу задачу, у вас строчка делится на две части:
1) начало строки, которое не нужно менять.
2) хвост, который как-то надо поменять.
Проблема в том, что изменения №2 не должны затрагивать №1. Стандартное решение: распилить строку на 2 части, голову и хвост. И к каждой части применить своё преобразование (в нашем случае к голове ничего применять не надо).

Ну так вот, я сохраняю дубликат сточки в дополнительном буфере, и затем выделяю голову стирая хвост. (п1 и п2 в цитате).
Затем я меняю местами буфера, и теперь стираю голову. (п3 и п4). У нас остаётся только хвост.

После этого, я применяю все нужные преобразования к хвосту (там у вас что-то требуется стирать). (п5)

Теперь в основном буфере у нас хвост, а в дополнительном голова. Имеется команда H которая подцепляет основной буфер к дополнительному. Ей я и воспользовался. В результате, в дополнительном буфере у нас будет почти готовый результат. Его-то я и извлекаю из дополнительного буфера командой g. Тут надо учесть, что команда H соединяет буфера не впритык, а через перевод строки (\n), его я меняю на пробел (хотя это и не обязательно, но может затруднить дальнейший анализ).

#107009
valet написал:
Очень похоже на правду.
ну к сожалению логика у меня не настолько железная, чтобы полностью понять суть всего этого.
Не могли бы объяснить поподробнее...

это вопрос привычки. На самом деле, такое применяется если есть множество групп, между которыми надо что-то удалять. Но когда подстрок всего две, намного удобнее распилить строку на две части, а потом их склеить, как в прошлом посте.

#107098
drBatty написал:
На самом деле, такое применяется если есть множество групп

У меня так и есть, текстовый файл 600 Мб, где-то 30 тысяч рассматриваемых блоков.

#107102

Я вот себе так подумал: а можно в sed заменить первое вхождение некой подстроки после найденной по критерию.
Сложно мне объяснить, поэтому покажу на примере/

Есть такое:

text
# ЗАМЕНЯЕТ "foo" на "bar" ТОЛЬКО для строк ,содержащих "baz"
sed '/baz/s/foo/bar/g' 

А мне надо так:
# ТОЛЬКО для строк, содержащих "baz" заменяет первое вхождение foo на bar.

Тогда мою задачу можно выполнить в 2 этапа:
1. Заменить первое после <b>О фильме: </b> вхождение <br /> на скажем xxxxxxxxxxzzzzzzzzzzzz
2. Заменить вхождение в регулярку xxxxxxxxxxzzzzzzzzzzzz.*конец строки на пусто

Так возможно?

#107147
valet написал:
# ТОЛЬКО для строк, содержащих "baz" заменяет первое вхождение foo на bar.

Тогда мою задачу можно выполнить в 2 этапа:
1. Заменить первое после <b>О фильме: </b> вхождение <br /> на скажем xxxxxxxxxxzzzzzzzzzzzz
2. Заменить вхождение в регулярку xxxxxxxxxxzzzzzzzzzzzz.*конец строки на пусто

Так возможно?

что-бы заменялось только первое вхождение, просто уберите g.

примера не понял. Можно представить:
1) было:
2) стало:
?

#107149
valet написал:
У меня так и есть, текстовый файл 600 Мб, где-то 30 тысяч рассматриваемых блоков.

имеется ввиду "множество групп в пределах одной строки".

Да, и строчки в базе обычно надо резать на строчки как в таблице. Т.е., если скажем в БД есть одна строчка, то в дампе это тоже должна быть одна строчка. Иначе всё очень замедляется и усложняется.

#107185
drBatty написал:
что-бы заменялось только первое вхождение, просто уберите g.

в том то и проблема, что не просто первое, а первое после <b>О фильме: </b>

#107214

В общем остановился на такой задаче: как сложить регулярку такую:
<b>О фильме: </b> <br />(которого может и не быть) какой-то текст <br />.

При первом проходе sed'ом после этой регулярки проставить например xxxx конструкцией &xxxx
При втором проходе останется заменить вхождение в регулярку xxxxконецстроки на пусто.

И задача решена. Вопрос только как составить такую регулярку.

#107673

Почти что решил задачу здесь, но по моей же ошибки все равно еще не совсем то.

Вопрос спецам по регекспам: как найти охватить только следующее вхождение после заданного.
В моем случае надо найти первый <br /> после <b>О фильме: </b>.

Если использовать

text
<b>О фильме: </b>.*<br />

- то получается жадная квантификация и охватывается самое последнее вхождение в строку <br />
В википедии прочитал, что для ленивой следует использовать

text
<b>О фильме: </b>.*?<br />

.
Но у меня этот вариант не работает.

Подскажите как мне найти первое вхождение <br /> после b>О фильме: </b>.

Войдите или зарегистрируйтесь, чтобы ответить.