нужна помощь по shell (парсинг заголовков письма)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

GUID
Сообщения: 3

нужна помощь по shell

Сообщение GUID »

Добрый день!
Пытаюсь парсить письмо с помощью скрипта. Само письмо "попадает в скрипт" через канал (stdin).
В частности рассмотрим следующую последовательность строк:

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

Received: from ey-in-f111.1e100.net [74.125.79.111]
        by c0a8:764:1872:ff7f::5f:4300 with IMAP (fetchmail-6.3.13)
        for <vPostman@localhost> (single-drop); Fri, 18 Dec 2009 00:14:04 +0300 (MST)
Received: by 10.140.132.1 with SMTP id f1cs449891rvd; Thu, 17 Dec 2009
  13:11:51 -0800 (PST)

Скрипт:

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

#! /bin/sh

while read LINE; do
    echo "$LINE"
done

Выводит:

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

Received: from ey-in-f111.1e100.net [74.125.79.111]
by c0a8:764:1872:ff7f::5f:4300 with IMAP (fetchmail-6.3.13)
for <vPostman@localhost> (single-drop); Fri, 18 Dec 2009 00:14:04 +0300 (MST)
Received: by 10.140.132.1 with SMTP id f1cs449891rvd; Thu, 17 Dec 2009
13:11:51 -0800 (PST)

"услужливо" подрезая начальные пробелы (табуляцию), наличие которых (в данном случае) указывает, что строка является продолжением предыдущей.
На данный момент решил эту проблему с помощью регулярных выражений... но, это "тяжелое" решение + не совсем в нем уверен.
ВОПРОС 1: как получить с stdin полную строку (с начальными пробелами)?
-------------------------------------------
Второй вопрос касается "косвенных ссылок" на переменные.

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

VAR=""
RLINK="VAR"
eval $RLINK="some_text"
echo "$VAR"

Этот вариант нормально отрабатывает и выдает "some_text", но как только появляется пробел в строке "some text", то на выходе получаем:

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

test.sh: eval: 1: text: not found

ВОПРОС 2: можно ли присвоить переменной по ссылке произвольную строку текста?

Заранее СПАСИБО за Ваши ответы!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: нужна помощь по shell

Сообщение /dev/random »

1) read:

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

$ read a
    qwe
$ echo "$a"
qwe
$ read
    qwe
$ echo "$REPLY"
    qwe


2) переменные

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

$ a=b
$ declare "$a=q w e"
$ echo "$a"
b
$ echo "$b"
q w e
$ echo "${!a}"
q w e
Спасибо сказали:
GUID
Сообщения: 3

Re: нужна помощь по shell

Сообщение GUID »

еще раз СПАСИБО за Ваши ответы!
Но, к сожалению, они мне не помогут, т.к. у меня не bash (что было косвенно указано в моем первом вопросе: #! /bin/sh)

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

$ read
-sh: read: arg count

$ declare "$a= q w e"
-sh: declare: not found
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: нужна помощь по shell

Сообщение /dev/random »

Хм. Тогда:

1) портируемого способа прочитать строку вместе с пробелами в переменную окружения нет, нужно либо использовать фичи данной конкретной реализации шелла (какая у вас?), либо извращаться подобными способами:

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

#!/bin/sh
if [ -z "$INSIDE" ]
then
  export INSIDE=yes
  xargs -i -d$'\n' "$0" '{}'
else
  echo "We got line '$1'. Now we can do something with it."
  # do something with "$1"
fi


2) тогда используйте export вместо declare
Спасибо сказали:
GUID
Сообщения: 3

Re: нужна помощь по shell

Сообщение GUID »

/dev/random писал(а):
18.12.2009 19:21
фичи данной конкретной реализации шелла (какая у вас?)

э-э-э-э-э... "sh из BusyBox v1.1.3" является ответом на Ваш вопрос?
(linux на asus wl-500, прошивка "от Олега")

Я уже понял, что мой вариант шелла очень обрезанный, поэтому решил пойти другим путем - скрипт будет заточен под конкретную задачу (шаг влево или вправо - ошибка)...
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: нужна помощь по shell

Сообщение t.t »

Критично парсить заголовки именно средствами shell? Нет возможности воспользоваться formail / reformail / reformime?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: нужна помощь по shell

Сообщение /dev/random »

t.t писал(а):
26.12.2009 15:28
Критично парсить заголовки именно средствами shell? Нет возможности воспользоваться formail / reformail / reformime?

Критично. См. сообщение про то, что это за шелл. По сути, кроме бизибокса и входящих в него утилит, в этой девайсине парсить сообщения нечем, если не собирать собственную прошивку.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: нужна помощь по shell

Сообщение t.t »

/dev/random писал(а):
26.12.2009 15:38
t.t писал(а):
26.12.2009 15:28
Критично парсить заголовки именно средствами shell? Нет возможности воспользоваться formail / reformail / reformime?
Критично. См. сообщение про то, что это за шелл. По сути, кроме бизибокса и входящих в него утилит, в этой девайсине парсить сообщения нечем, если не собирать собственную прошивку.
Да, прошу прощения. Почему-то это сообщения не увидел.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: нужна помощь по shell

Сообщение t.t »

Может быть, стоит добавить немного sed? Если строки, начинающиеся с пробелов, нужно обрабатывать именно shell-ом, то можно подставить костыль в виде sed -r 's/^([ \t])/|\1/' до и tr -d \| после. А может быть и более широкую часть задачи, или даже всю задачу, можно решить с помощью sed + tr?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: нужна помощь по shell

Сообщение drBatty »

t.t писал(а):
26.12.2009 18:08
Может быть, стоит добавить немного sed?

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

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: нужна помощь по shell

Сообщение watashiwa_daredeska »

read разбивает строку на токены по $IFS. Так что, надо просто в IFS оставить только \r\n и должно быть нормально.
Спасибо сказали: