Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Помогите с SED регулярками  (Прочитано 814 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
Помогите с SED регулярками
« : 29 Июля 2014, 10:50:02 »
Здравствуйте.
Есть файл index.html, с него нужно извлечь ссылки.
Все регулярки sed -в одном фале, для чистоты кода.

cat index.html | sed -nrf contpost_2.sed
contpost_2.sed
#!/bin/sed
# Разделение тегов на строки.
s/</\n</g
# Извлечение всех тегов img
# там знаки равенства и подчёркивания - для отладки
s|((.*<img[^>]*>)+.*)+|=\2_\n|gp

На выходе:
=
<img width="200" height="150" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin2.jpg" />_

=
<img width="250" height="198" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-uollera.jpg" />
<img width="200" height="200" class="alignright size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-fiesta.jpg" />_

=
<img width="250" height="174" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin3.jpg" />_

=Семена высевают в феврале,прорастают через 10-15 дней, зацветают через 3-4 месяца.
<img width="250" height="168" class="alignright size-full wp-image-10" src="/media/balzamin4.jpg" alt="Бальзамин" />_

Здесь он 2 и 3 рисунки выдал как 1 строчку. Если это отфильтровать через grep:
cat index.html | sed -nrf contpost_2.sed | grep imgВывод:
<img width="200" height="150" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin2.jpg" />_
<img width="250" height="198" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-uollera.jpg" />
<img width="200" height="200" class="alignright size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-fiesta.jpg" />_
<img width="250" height="174" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin3.jpg" />_
<img width="250" height="168" class="alignright size-full wp-image-10" src="/media/balzamin4.jpg" alt="Бальзамин" />_
рисунки нормально разделятся.
Но здесь же видно, что второй и третий слеплены, (подчёркивание справа)

В исходном html файле второй и третий рисунки одной строчкой идут. Для этого вначале разделил все теги переводом строки.

Все попытки вывернуть пути src с img заканчивались тем, что второго нет.

спасибо

Пользователь решил продолжить мысль 29 Июля 2014, 11:39:01:
То же самое другим методом.
cat index.html | sed "s/</\n</g" | sed -rn 's|.*(<img[^>]*>).*|\1|gp'На выходе 5 ссылок:
<img width="200" height="150" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin2.jpg" />
<img width="250" height="198" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-uollera.jpg" />
<img width="200" height="200" class="alignright size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-fiesta.jpg" />
<img width="250" height="174" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin3.jpg" />
<img width="250" height="168" class="alignright size-full wp-image-10" src="/media/balzamin4.jpg" alt="Бальзамин" />

То же самое, но в скрипте:
cat index.html | sed -nrf contpost_2.sedкод contpost_2.sed:
s/</\n</g
s|.*(<img[^>]*>).*|\1|gp
На выходе уже 4 ссылки:
<img width="200" height="150" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin2.jpg" />
<img width="200" height="200" class="alignright size-full wp-image-10" alt="Бальзамин" src="/media/balzamin-fiesta.jpg" />
<img width="250" height="174" class="alignleft size-full wp-image-10" alt="Бальзамин" src="/media/balzamin3.jpg" />
<img width="250" height="168" class="alignright size-full wp-image-10" src="/media/balzamin4.jpg" alt="Бальзамин" />
Потерялась вторая

Вот разница лишь в том, что код SED поместил в файл. Что за....?
« Последнее редактирование: 29 Июля 2014, 11:39:01 от Dexel »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с SED регулярками
« Ответ #1 : 29 Июля 2014, 15:01:54 »
А зачем "мучить" sed когда grep’а вполне достаточно?
Код: (bash) [Выделить]
grep -o '<img[^>]*>' index.html
Пользователь решил продолжить мысль [time]29 Июль 2014, 15:49:18[/time]:
А разница в "другом методе" между строкой и скриптом состоит в том что в строке над всем файлом выполняется разделение по строкам, а потом (по пайпу) над этими строками (всеми по очереди) выполняется извлечение ссылок, а при работе скрипта обе операции выполняются над одной строкой последовательно. Как говорится "почувствуй разницу"
Код: (bash) [Выделить]
sed "s/</\n</g" | sed -rn 's|.*(<img[^>]*>).*|\1|gp'a скриптом:
Код: (bash) [Выделить]
sed -rne "s/</\n</g" -e 's|.*(<img[^>]*>).*|\1|gp'
« Последнее редактирование: 29 Июля 2014, 17:50:06 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.019 секунд. Запросов: 22.