LinuxForum.Fans
Тема

Как и чем сделать сложную выборку из текста

Автор: valet 17 сообщений 7224 просмотров
#267605

Стоит задача выдирать ник и ссылку на подтверждение регистрации из писем к примеру:

From - Thu Aug 2 23:48:15 2012
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Received: from mxfront38.mail.yandex.net ([127.0.0.1])
by mxfront38.mail.yandex.net with LMTP id lmnibfCD
for <reise2012@yandex.ru>; Fri, 3 Aug 2012 00:47:48 +0400
Received: from mailforward.mailhostbox.com (mailforward.mailhostbox.com [70.87.28.62])
by mxfront38.mail.yandex.net (nwsmtp/Yandex) with ESMTP id llmOuiql-llmuQ3p2;
Fri, 3 Aug 2012 00:47:47 +0400
X-Yandex-Front: mxfront38.mail.yandex.net
X-Yandex-TimeMark: 1343940467
X-Yandex-Spam: 1
Received: from mx1.mailhostbox.com (inbound-us1.mailhostbox.com [70.87.28.133])
by mailforward.mailhostbox.com (Postfix) with ESMTP id 3FF6C162B661
for <reise2012@yandex.ru>; Thu, 2 Aug 2012 20:47:47 +0000 (GMT)
Received: from mainserver.main-hosting.eu (unknown [31.170.164.250])
by mx1.mailhostbox.com (Postfix) with ESMTP id 09575471803
for <maxawoh@mail.ru>; Thu, 2 Aug 2012 20:47:45 +0000 (GMT)
Received: from nobody by mainserver.main-hosting.eu with local (Exim 4.77)
(envelope-from <nobody@mainserver.main-hosting.eu>)
id 1Sx2J6-00007u-N7
for maxawoh@mail.ru; Thu, 02 Aug 2012 21:47:44 +0100
To: maxawoh <maxawoh@mail.ru>
Subject: =?UTF-8?Q??= =?UTF-8?Q?=D0=9F=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?Q?=D0=A0=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=9A=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?=
From: =?UTF-8?Q?Hostinger=20=D0=A0=D0=BE=D1=81=D1=81=D0=B8=D1=8F?= <ru@hostinger.com>
Date: Thu, 02 Aug 2012 21:47:44 +0100
Content-Type: multipart/alternative;
boundary="=_9fe4f89a17284cebdd44a2a22115d7b5"
MIME-Version: 1.0
Message-Id: <E1Sx2J6-00007u-N7@mainserver.main-hosting.eu>
X-AntiAbuse: This header was added to track abuse, please include it with any abuse report
X-AntiAbuse: Primary Hostname - mainserver.main-hosting.eu
X-AntiAbuse: Original Domain - mail.ru
X-AntiAbuse: Originator/Caller UID/GID - [99 99] / [47 12]
X-AntiAbuse: Sender Address Domain - mainserver.main-hosting.eu
X-NetCologne-Spam: Suspect
X-CTCH-VOD: Unknown
X-CTCH-RefID: str=0001.0A0B0209.501AE773.0077,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=512,sb=0
Return-Path: nobody@mainserver.main-hosting.eu
X-Yandex-Forward: 62a022fa42d8e6b0df4bd98411b2f4b1

--=_9fe4f89a17284cebdd44a2a22115d7b5
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

=0A=D0=A3=D0=B2=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9 maxawoh ,=0A=
=0A=D0=A1=D0=BF=D0=B0=D1=81=D0=B8=D0=B1=D0=BE =D0=B7=D0=B0 =D1=82=D0=BE,=
=D1=87=D1=82=D0=BE =D0=92=D1=8B =D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=D0=
=B8 =D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82 =D1=83 =D0=BD=D0=B0=D1=81=
. =D0=94=D0=BB=D1=8F=0A=D1=82=D0=BE=D0=B3=D0=BE =D1=87=D1=82=D0=BE=D0=B1=
=D1=8B =D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=
=82=D1=8C =D0=92=D0=B0=D1=88 =D0=BF=D1=80=D0=BE=D1=84=D0=B0=D0=B9=D0=BB=
=D0=BD=D0=B0=D0=B6=D0=BC=D0=B8=D1=82=D0=B5 =D0=BD=D0=B0=0A=D1=81=D1=81=
=D1=8B=D0=BB=D0=BA=D1=83 =D0=BD=D0=B8=D0=B6=D0=B5:=0A=0Ahttp://cpanel.ho=
stinger.ru/auth/confirm/hash/NzEzODc2NzUz=0A=0A=D0=91=D0=BB=D0=B0=D0=B3=
=D0=BE=D0=B4=D0=B0=D1=80=D0=B8=D0=BC =D0=92=D0=B0=D0=BC=0A=0AHostinger=
=D0=A0=D0=BE=D1=81=D1=81=D0=B8=D1=8F=0Ahttp://www.hostinger.ru

--=_9fe4f89a17284cebdd44a2a22115d7b5
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<p>=D0=A3=D0=B2=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9 maxawoh ,<br /=
><br />=D0=A1=D0=BF=D0=B0=D1=81=D0=B8=D0=B1=D0=BE =D0=B7=D0=B0 =D1=82=D0=
=BE, =D1=87=D1=82=D0=BE =D0=92=D1=8B&nbsp; =D1=81=D0=BE=D0=B7=D0=B4=D0=
=B0=D0=BB=D0=B8 =D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82 =D1=83 =D0=BD=
=D0=B0=D1=81. =D0=94=D0=BB=D1=8F =D1=82=D0=BE=D0=B3=D0=BE =D1=87=D1=82=
=D0=BE=D0=B1=D1=8B =D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=
=B2=D0=B0=D1=82=D1=8C =D0=92=D0=B0=D1=88 =D0=BF=D1=80=D0=BE=D1=84=D0=B0=
=D0=B9=D0=BB =D0=BD=D0=B0=D0=B6=D0=BC=D0=B8=D1=82=D0=B5 =D0=BD=D0=B0 =D1=
=81=D1=81=D1=8B=D0=BB=D0=BA=D1=83 =D0=BD=D0=B8=D0=B6=D0=B5:<br /><br /><=
a href=3D"http://cpanel.hostinger.ru/auth/confirm/hash/NzEzODc2NzUz">htt=
p://cpanel.hostinger.ru/auth/confirm/hash/NzEzODc2NzUz</a><br /><br />=
=D0=91=D0=BB=D0=B0=D0=B3=D0=BE=D0=B4=D0=B0=D1=80=D0=B8=D0=BC =D0=92=D0=
=B0=D0=BC<br /><br />Hostinger =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D1=8F<br /=
><a href=3D"http://www.hostinger.ru">http://www.hostinger.ru</a></p>

--=_9fe4f89a17284cebdd44a2a22115d7b5--

From - Fri Aug 3 00:12:22 2012
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Received: from mxfront23.mail.yandex.net ([127.0.0.1])
by mxfront23.mail.yandex.net with LMTP id CdkSoZAx
for <reise2012@yandex.ru>; Fri, 3 Aug 2012 01:12:39 +0400
Received: from mailforward.mailhostbox.com (mailforward.mailhostbox.com [70.87.28.63])
by mxfront23.mail.yandex.net (nwsmtp/Yandex) with ESMTP id CcTmh6p6-CcTqKmSr;
Fri, 3 Aug 2012 01:12:38 +0400
X-Yandex-Front: mxfront23.mail.yandex.net
X-Yandex-TimeMark: 1343941958
X-Yandex-Spam: 1
Received: from mx1.mailhostbox.com (inbound-us1.mailhostbox.com [70.87.28.133])
by mailforward.mailhostbox.com (Postfix) with ESMTP id 85C39162BED7
for <reise2012@yandex.ru>; Thu, 2 Aug 2012 21:12:37 +0000 (GMT)
Received: from mainserver.main-hosting.eu (unknown [31.170.164.250])
by mx1.mailhostbox.com (Postfix) with ESMTP id 623B7471198
for <voqavad@mail.ru>; Thu, 2 Aug 2012 21:12:37 +0000 (GMT)
Received: from nobody by mainserver.main-hosting.eu with local (Exim 4.77)
(envelope-from <nobody@mainserver.main-hosting.eu>)
id 1Sx2hA-0000Wc-Ph
for voqavad@mail.ru; Thu, 02 Aug 2012 22:12:36 +0100
To: voqavad <voqavad@mail.ru>
Subject: =?UTF-8?Q??= =?UTF-8?Q?=D0=9F=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?Q?=D0=A0=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=9A=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?=
From: =?UTF-8?Q?Hostinger=20=D0=A0=D0=BE=D1=81=D1=81=D0=B8=D1=8F?= <ru@hostinger.com>
Date: Thu, 02 Aug 2012 22:12:36 +0100
Content-Type: multipart/alternative;
boundary="=_651f6e5441e6b59bddaf3e99565fed7d"
MIME-Version: 1.0
Message-Id: <E1Sx2hA-0000Wc-Ph@mainserver.main-hosting.eu>
X-AntiAbuse: This header was added to track abuse, please include it with any abuse report
X-AntiAbuse: Primary Hostname - mainserver.main-hosting.eu
X-AntiAbuse: Original Domain - mail.ru
X-AntiAbuse: Originator/Caller UID/GID - [99 99] / [47 12]
X-AntiAbuse: Sender Address Domain - mainserver.main-hosting.eu
X-NetCologne-Spam: Suspect
X-CTCH-VOD: Unknown
X-CTCH-RefID: str=0001.0A0B0206.501AED45.00DF,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=512,sb=0
Return-Path: nobody@mainserver.main-hosting.eu
X-Yandex-Forward: 62a022fa42d8e6b0df4bd98411b2f4b1

--=_651f6e5441e6b59bddaf3e99565fed7d
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

=0A=D0=A3=D0=B2=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9 voqavad ,=0A=
=0A=D0=A1=D0=BF=D0=B0=D1=81=D0=B8=D0=B1=D0=BE =D0=B7=D0=B0 =D1=82=D0=BE,=
=D1=87=D1=82=D0=BE =D0=92=D1=8B =D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=D0=
=B8 =D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82 =D1=83 =D0=BD=D0=B0=D1=81=
. =D0=94=D0=BB=D1=8F=0A=D1=82=D0=BE=D0=B3=D0=BE =D1=87=D1=82=D0=BE=D0=B1=
=D1=8B =D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=
=82=D1=8C =D0=92=D0=B0=D1=88 =D0=BF=D1=80=D0=BE=D1=84=D0=B0=D0=B9=D0=BB=
=D0=BD=D0=B0=D0=B6=D0=BC=D0=B8=D1=82=D0=B5 =D0=BD=D0=B0=0A=D1=81=D1=81=
=D1=8B=D0=BB=D0=BA=D1=83 =D0=BD=D0=B8=D0=B6=D0=B5:=0A=0Ahttp://cpanel.ho=
stinger.ru/auth/confirm/hash/NDYyODg5MzE2=0A=0A=D0=91=D0=BB=D0=B0=D0=B3=
=D0=BE=D0=B4=D0=B0=D1=80=D0=B8=D0=BC =D0=92=D0=B0=D0=BC=0A=0AHostinger=
=D0=A0=D0=BE=D1=81=D1=81=D0=B8=D1=8F=0Ahttp://www.hostinger.ru

--=_651f6e5441e6b59bddaf3e99565fed7d
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<p>=D0=A3=D0=B2=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9 voqavad ,<br /=
><br />=D0=A1=D0=BF=D0=B0=D1=81=D0=B8=D0=B1=D0=BE =D0=B7=D0=B0 =D1=82=D0=
=BE, =D1=87=D1=82=D0=BE =D0=92=D1=8B&nbsp; =D1=81=D0=BE=D0=B7=D0=B4=D0=
=B0=D0=BB=D0=B8 =D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82 =D1=83 =D0=BD=
=D0=B0=D1=81. =D0=94=D0=BB=D1=8F =D1=82=D0=BE=D0=B3=D0=BE =D1=87=D1=82=
=D0=BE=D0=B1=D1=8B =D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B8=D1=80=D0=BE=D0=
=B2=D0=B0=D1=82=D1=8C =D0=92=D0=B0=D1=88 =D0=BF=D1=80=D0=BE=D1=84=D0=B0=
=D0=B9=D0=BB =D0=BD=D0=B0=D0=B6=D0=BC=D0=B8=D1=82=D0=B5 =D0=BD=D0=B0 =D1=
=81=D1=81=D1=8B=D0=BB=D0=BA=D1=83 =D0=BD=D0=B8=D0=B6=D0=B5:<br /><br /><=
a href=3D"http://cpanel.hostinger.ru/auth/confirm/hash/NDYyODg5MzE2">htt=
p://cpanel.hostinger.ru/auth/confirm/hash/NDYyODg5MzE2</a><br /><br />=
=D0=91=D0=BB=D0=B0=D0=B3=D0=BE=D0=B4=D0=B0=D1=80=D0=B8=D0=BC =D0=92=D0=
=B0=D0=BC<br /><br />Hostinger =D0=A0=D0=BE=D1=81=D1=81=D0=B8=D1=8F<br /=
><a href=3D"http://www.hostinger.ru">http://www.hostinger.ru</a></p>

--=_651f6e5441e6b59bddaf3e99565fed7d--

С этих 2-х писем надо получить 2 строки с логинами и хешами к ссылке подтверждения:

maxawoh;NzEzODc2NzUz
voqavad;NDYyODg5MzE2

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

Все копал в сторону:

Печатать часть файла между двумя регулярными выражениями (включительно):

sed -n '/Iowa/,/Montana/p' (регистро зависимый)

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

#267617

у муня так получилось:

text

#!/bin/sed -rn
/To: (\S+) <.*>/{
   s//\1/;
   x };
/a .*href=3D"http:\/\/cpanel.hostinger.ru\/auth\/confirm\/hash\/(\w+)".*/ {
  s//\1/;
  x;
  G;
  s/\n/;/;
  p
}

можно и лучше сделать, но мне было не охото ломать голову с jump'ами...

#267644

Фат-Зер, ну что ты за человек, а?
Кому нужны твои "каракули"?

человек просит алгоритма а не код.

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

#267658
moshell написал:
Фат-Зер, ну что ты за человек, а?
Кому нужны твои "каракули"?

человек просит алгоритма а не код.

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

А нужна ли воля мысли?
Вот она, воля: perl+perl-Mail-Mbox-MessageParser, В ощем случаи perl-Mail-xxxxx

#267662
CyberDaemon написал:
[quote=moshell]Фат-Зер, ну что ты за человек, а?
Кому нужны твои "каракули"?

человек просит алгоритма а не код.

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

А нужна ли воля мысли?
Вот она, воля: perl+perl-Mail-Mbox-MessageParser, В ощем случаи perl-Mail-xxxxx[/quote]
а мне привиделось Mail-sed

#267670
"moshell" написал:
Фат-Зер, ну что ты за человек, а?
Кому нужны твои "каракули"?

нацарапать быстрее, а если человек не дурак, то алгоритм с помощью манов разберёт.... ну или спросит, как оно работает...
если просто подставит бездумно — его проблемы...

#267693

valet, посмотрите в сторону awk. В частности там есть ключ -F что означает разделитель. Как минимум знак @ идеально подходит под разделитель.
Например строка
echo 'maxawoh@mail.ru' | awk -F"@" '{print $1}'
выведет
maxawoh, т.е. то, что слева от разделителя.
Так что строка

text

sed "каракули" | awk "каракули"

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

#267759
Fat-Zer написал:
у муня так получилось:
text

#!/bin/sed -rn
/To: (\S+) <.*>/{
   s//\1/;
   x };
/a .*href=3D"http:\/\/cpanel.hostinger.ru\/auth\/confirm\/hash\/(\w+)".*/ {
  s//\1/;
  x;
  G;
  s/\n/;/;
  p
}

можно и лучше сделать, но мне было не охото ломать голову с jump'ами...

У меня к сожалению не работает, выдает:

text
/bin/sed: -e выражение #1, символ 1: неизвестная команда: `.'
#267760

"moshell" написал:
Фат-Зер, ну что ты за человек, а?
Кому нужны твои "каракули"?

человек просит алгоритма а не код.

указал бы, в чем состоит соль и прелесть рег выражений, на основе чего формируется шаблон, перед, после, содержание и т.д.
готовые решения не интересны. дай волю мысли.
В данном случае мне как раз нужен рабочий код, потому что нету времени разбираться, а задача висит.
#267781
"valet" написал:
У меня к сожалению не работает, выдает:
"valet" написал:
В данном случае мне как раз нужен рабочий код, потому что нету времени разбираться, а задача висит.

тогда символический полтинник в яндекс-пиастрах....

Показать
ошибка мелкая, элементарная и связана с особенностью записи сед в виде файла-скрипта
#267808

"Fat-Zer" написал:
тогда символический полтинник в яндекс-пиастрах....
что это значит?

"Fat-Zer" написал:
ошибка мелкая, элементарная и связана с особенностью записи сед в виде файла-скрипта
вы не могли бы дать скрипт без ошибок? Я догадываюсь в принципе, что связано с экранированием и слешами, поэтому я лично всегда в сед-скриптах разделителем использую ~, но так как я вообще не могу понять как работает этот скрипт (мои скрипты значительно проще и работают исключительно с отдельными строками), то исправить сам ее не смогу...





Без наездов друг на друга, пожалуйста.
Лишнее ушло в небытие.
verg
#267813

Ну и чтобы уже быть до конца принципиальным, чтобы никто не подумал, что я полтинник зажал :), Fat-Zer, скиньте, пожалуйста, в личку WMR-кошелек (яндекс.деньгами вообще не пользуюсь), но ЗАДАЧУ РЕШАТЬ НЕ НАДО! раз уже на то пошло, сам как-то по-другому полукриво сделаю...

#267820

valet, вот вариант на Питоне...

text

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

def Find (patt, data): match = re.findall(patt, data) if match: mass = [] for stroka in match: mass.append(stroka) else: print ('Ничего не найдено..') return mass f = open('file.txt', 'r') data = f.read() hash_patt = re.compile(r'/auth/confirm/hash/(.+?)</a>') hashes = Find(hash_patt, data) name_patt = re.compile(r'To: (.+?)<.+?>') names = Find(name_patt, data) d = dict(zip(names, hashes)) print (d)

file.txt - имя файла для обработки.
Если заработает, не забудьте про своё обещание Fat-Zer-у

#267843

дело не в экранировании... просто в первой строке не хватает ключика -f, а разозлило меня то, что элементарную опечатку не заметили и не попробовали хотя бы парой способов других запустить скрипт.... ну и погуглить, что за фигня вообще происходит....
ведь видно же, что первый символ в скрипте явно не точка...

#267926

"-=Serj=-" написал:
Если заработает, не забудьте про своё обещание Fat-Zer-у
Да, я же сказал, жду кошелек, хотя подсказками из этой темы принципиально не пользовался. Сделал кривовато, но по-своему.

"Fat-Zer" написал:
просто в первой строке не хватает ключика -f
ради интереса попробовал ваш вариант с ключиком - f в первой строке, то есть как я понимаю:
text
#!/bin/sed -frn

не помогло, скрипт выдает уже другую ошибку:

/bin/sed: невозможно открыть файл rn: Нет такого файла или каталога
. То есть я догадываюсь что ключик -f как бы не там, но я же вставил так как вы посоветовали - в первую строку :)

Тем не менее задачу я уже решил вообще другим способом, а от вас Fat-Zer жду кошелек в личке :)
#269566
"valet" написал:
/bin/sed: невозможно открыть файл rn: Нет такого файла или каталога

а загадочное имя файла «rn» не смущает?
просто в конец строки добавлять надо

#269946
"valet" написал:
#!/bin/sed -frn

-rnf

Хотя, если вы с первой строкой не можете разобраться...

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