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


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

Автор Тема: sed: получить строку и все последующие по маске  (Прочитано 259 раз)

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

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25059
    • Просмотр профиля
Пока достиг только этого, но "p" печатает только первую строку сохранённого блока.
Помню, что решение есть, и простое, но не помню, как его добились.
#/bin/bash

sed -Ee '
  #/^([Tt][Oo]|[Cc][Cc]):/,/^[[:space:]]/p;
  1{
    /^[^[:space:]]/{
      x
      d
    }
  }
  /^[^[:space:]]/,/^[[:space:]]/{
    x
    /^([Tt][Oo]|[Cc][Cc]):/{
      p
    }
    d
  }
  /^[[:space:]]+[^[:space:]]/{
    H
    d
  }
  /^[[:space:]]*$/{
    x
    q
  }
' -- <<<"Received: by f373.i.mail.ru with local (envelope-from <2015@aaaaa.ru>)
id 1eqmK5-0005ef-P3; Tue, 27 Feb 2018 23:58:08 +0300
Received: by e.mail.ru with HTTP;
Tue, 27 Feb 2018 23:58:05 +0300
To: =?UTF-8?B?aW5mbw==?= <info@xxx.ru>,
=?UTF-8?B?aW5mbw==?= <info@yyy.ru>,
=?UTF-8?B?aW5mbw==?= <info@zzz.ru>,
=?UTF-8?B?aW5mbw==?= <info@gggg.ru>,
=?UTF-8?B?aW5mbw==?= <info@rrrr.ru>,
=?UTF-8?B?aW5mbw==?= <info@ssss.ru>,
=?UTF-8?B?aW5mbw==?= <info@hhhh.ru>,
=?UTF-8?B?aW5mbw==?= <info@nnnn.ru>
MIME-Version: 1.0
X-Mailer: Mail.Ru Mailer 1.0
Date: Tue, 27 Feb 2018 23:58:05 +0300
"
« Последнее редактирование: 28 Март 2018, 23:04:24 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5441
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
AnrDaemon, проще написать что именно ты хочешь получить из представленного образца (читать чужой код - это сильно напрягаться). Есть много способов:
  • выводить по n
  • собрать по N и потом вывести
  • запустить цикл по условию
  • ...

В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25059
    • Просмотр профиля
Получить "^(to|cc): и все последующие линии, начинающиеся с пробела и не пустые.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5441
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Попробуйsed '/^to:\|^cc:/I! d;:1;n;/^\s\+\S/b1;d'
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25059
    • Просмотр профиля
Работает… осталось понять, как???

Пользователь добавил сообщение 29 Март 2018, 13:26:58:
И с какого перепугу в sed работают перловые эскейпы? :x
« Последнее редактирование: 29 Март 2018, 13:26:58 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5441
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
осталось понять, как???
Что именно смущает?
Код: Bash
  1. #!/bin/sed -f
  2.  
  3. /^to:\|^cc:/I! d; # если не удовлетворяет условию - удалить, загрузить следующую строку
  4. :1; # метка 1 (для организации цикла)
  5. n; # отправить на печать (помним что строка удовлетворила условию иначе бы до этой операции не дошли), загрузить следующую строку
  6. /^\s\+\S/b1; # проверить строку на условие и если удовлетворяет вернуться на метку 1
  7. d # удалить строку (т.е. не удовлетворяет предыдущему условию)


Пользователь добавил сообщение 29 Март 2018, 14:05:13:
перловые эскейпы
С какого перепугу они стали перловыми? Стандартные BRE(Basic Regular Expression) -- see man grep
« Последнее редактирование: 29 Март 2018, 14:05:13 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25059
    • Просмотр профиля
Что именно смущает?
Ага…
Меня смущало, как будет себя вести скрипт после n. Но если он просто продолжается, тогда понятно, как это работает…
Спасибо!
« Последнее редактирование: 29 Март 2018, 23:55:09 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

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