Как я могу переформатировать сообщения в файле mbox с помощью bash или Perl?

У меня есть огромный файл mbox, в котором может быть около 500 писем.

Это выглядит так:

From [email protected] Fri Aug 12 09:34:09 2005
Message-ID: <[email protected]>
Date: Fri, 12 Aug 2005 09:34:09 +0900
From: me <[email protected]>
User-Agent: Mozilla Thunderbird 1.0.6 (Windows/20050716)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To: someone <[email protected]>
Subject: Re: (no subject)
References: <[email protected]>
In-Reply-To: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Status: RO
X-Status: 
X-Keywords:                 
X-UID: 371
X-Evolution-Source: imap://[email protected]/
X-Evolution: 00000002-0010

Hey

the actual content of the email

someone wrote:

> lines of quotedtext

Я хотел бы знать, как я могу удалить весь цитируемый текст, удалить большую часть заголовков, кроме строк «Кому», «От» и «Дата», и при этом сохранить его непрерывность.

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

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

Paul Tomblin 10.12.2008 20:02

эй считается за тело, так что все должно быть в порядке?

user1253538 10.12.2008 20:10

В вашем примере ничто не сможет сказать, где начинается тело. В RFC-822 тело определяется пустой строкой перед ним.

Paul Tomblin 10.12.2008 20:22

Но между «Привет» и заголовком эволюции есть пустая строка?

user1253538 11.12.2008 13:15

Когда я писал эти сообщения, я этого не видел. Не уверен, что это потому, что я был на работе, где меня заставляли использовать IE, или кто-то его редактировал.

Paul Tomblin 11.12.2008 14:53

Хорошо, я снова смотрю на это на работе, и пустая строка исчезла. Должно быть ошибка в IE.

Paul Tomblin 11.12.2008 18:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
3 189
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для начала я бы, вероятно, использовал «formail» для извлечения писем с нужными вам заголовками. Либо так, либо используйте какую-то таблицу состояний в awk, чтобы увидеть, находитесь ли вы в заголовке или нет, и либо удалите все, кроме желаемых заголовков, если вы находитесь в заголовке, и удалите кавычки, если нет.

Ответ Хадсона лучше моего. Возникает мета-вопрос: должны ли мы удалять наши ответы, когда появляется что-то получше, или только когда ваш ответ «плохой»?

Paul Tomblin 11.12.2008 18:22

Использование инструментов оболочки может быть не лучшим ответом на это, поскольку существует множество библиотек на многих языках для работы с mbox, будь то Ruby, Perl или что-то еще. Вы также должны учитывать, что символы цитирования не всегда являются ">", что может испортить ваш процесс отмены кавычек. Что касается извлечения нужных заголовков, это не должно вызывать затруднений на любом языке. Я знаю, что это общий ответ, возможно, недостаточно конкретный ...

Ответ принят как подходящий

Почта :: Ящик :: Mbox позволит вам легко разобрать файл на отдельные сообщения. слайды от YAPC :: Europe 2002 Марка Овермера подробно объясняет, почему синтаксический анализ намного сложнее, чем кажется. Эта библиотека также работает с mh, IMAP и многими другими форматами, помимо mbox.

    #!/usr/bin/perl
    use warnings;
    use strict;
    use Mail::Box::Manager;

    my $file = shift || $ENV{MAIL};
    my $mgr = Mail::Box::Manager->new(
        access      => 'r',
    );

    my $folder = $mgr->open( folder => $file )
    or die "$file: Unable to open: $!\n";

    for my $msg ($folder->messages)
    {
        my $to      = join( ', ', map { $_->format } $msg->to );
        my $from    = join( ', ', map { $_->format } $msg->from );
        my $date    = localtime( $msg->timestamp );
        my $subject = $msg->subject;
        my $body    = $msg->body;

        # Strip all quoted text
        $body =~ s/^>.*$//msg;

        print <<"";
    From: $from
    To: $to
    Date: $date
    $body

    }

Вы можете пересмотреть свой запрос на удаление цитируемого текста - что, если вы отправляете электронное письмо с чередующимися ответами? Удаление цитируемого текста сделало бы такое электронное письмо очень трудным для понимания:

  Foo wrote:
  > I like bar.

  Bar?  Who likes bar?

  > It is better than baz.

  Everyone knows that.

  -- 
  Quux

Кроме того, что вы планируете делать с вложениями, нетекстовыми / простыми типами MIME, закодированными текстовыми объектами и другими странностями?

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

user1253538 11.12.2008 13:08

Просто q быстрый вопрос, но принимает ли этот perl параметр или он использует переменную среды $ MAIL

user1253538 11.12.2008 15:00

Сценарий принимает параметр (my $ file = shift) или, если он не задан, по умолчанию используется переменная среды (|| $ ENV {MAIL}).

Hudson 11.12.2008 18:19

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

user1253538 12.12.2008 17:36

на самом деле, сотрите это, они не в хронологическом порядке в исходном файле ... черт возьми, я не знаю, как это исправить.

user1253538 12.12.2008 17:37

Есть ли простой способ отсортировать сообщения в хронологическом порядке?

user1253538 15.12.2008 15:37

= 20 из-за того, что он не является текстовым / простым, а вместо этого доступен для печати в кавычках. Вам нужно будет использовать синтаксический анализатор MIME для их преобразования и переформатирования, или if = 20 - единственный особый случай '$ body = ~ s / = 20 $ // msg;'. Для сортировки вы можете сделать что-то вроде 'for (sort {$ a-> timestamp <=> $ b-> timestamp} @ $ folder) {...}'

Hudson 15.12.2008 16:47

Другие вопросы по теме