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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Нужно что бы sed искал начало и конец RegExp строго друг за другом.  (Прочитано 9613 раз)

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

Оффлайн mixa3607

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
К примеру есть такая строка '00<1>nnnnnn</1> 55 <1>nnnnnnn</1>99' . Если выполнить sed 's|<1>.*</1>||g' то удалится всё между 00 и 99, а надо что бы удалилось с первого <1>  по первый </1> , и соответственно со второго <1> по второй </1>. В итоге должно быть не '0099' ,а '00 55 99'.
Надеюсь всё понятно объяснил.

shura1

  • Гость
echo '00<1>nnnnnn</1> 55 <1>nnnnnnn</1>99' | perl -pe 's!<1>.*?</1>!!g'
00 55 99

Это называется "ленивое" регулярное выражение. В GNU-утилитах такого нет. Можно сделать (и в данном примере не так уж сложно - (sed 's!<1>[^>]*</1>!!g'), но зачем? Чуть больше, чем нестандартная задача и затык, который легко решается однострочниками perl.

Пользователь решил продолжить мысль 30 Декабря 2015, 09:38:13:
Решение с помощью perl - универсально - пригодно для любых подобных случаев. То выражение, которое я дал для sed - однократное - применимо только для данного конкретного случая (подразумевается, что в промежутках, которые надо вытащить, нет символа ">")
« Последнее редактирование: 30 Декабря 2015, 09:38:13 от Jshura »

Оффлайн mixa3607

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Спасибище за помощь. За одно и сподвигли меня найти perl под андроид скомпиленый. Буду читать по нему.

shura1

  • Гость
ИМО про перл читать не надо. Язык пошел нагавно...гу с другими языками (чисто собственное ИМО, которое совсем не хочу обсуждать)

А вот однострочники perl - это замечательный инструмент для работы в командной строке. Вот этой серии постов вполне достаточно (наверное)

http://www.catonmat.net/blog/perl-one-liners-explained-part-one/

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
ИМО про перл читать не надо. Язык пошел нагавно...гу с другими языками (чисто собственное ИМО, которое совсем не хочу обсуждать)

А вот однострочники perl - это замечательный инструмент для работы в командной строке. Вот этой серии постов вполне достаточно (наверное)
Определитесь уже. Ведь одна строка или две зависит только от автора.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
В GNU-утилитах такого нет.
В grep есть PCRE, хотя эксперементально, но работает и достаточно стабильно.
Можно сделать (и в данном примере не так уж сложно - (sed 's!<1>[^>]*</1>!!g'), но зачем? Чуть больше, чем нестандартная задача и затык, который легко решается однострочниками perl.
Некоторые называют "затык", а другие — оптимизацией, т.к. «нежадный» поиск весьма время|ресурсозатратная процедура.
Решение с помощью perl - универсально - пригодно для любых подобных случаев. То выражение, которое я дал для sed - однократное - применимо только для данного конкретного случая (подразумевается, что в промежутках, которые надо вытащить, нет символа ">")
Достаточно спорное утверждение — тут всё зависит от умения выбирать и пользоваться имеющимся инструментарием
Код: (bash) [Выделить]
sed -r 's|<(1>)[^/]*</\1||g'
sed -r 's|<(1>)\S*</\1||g'
sed -r 's|<.*(\s[0-9]+\s).*>|\1|'
sed 's|</?1>|\n|g;s|\n[^\n]*\n||g'
В любом случае, каждый поиск — достаточно уникален, чтобы придумать исключительно универсальное решение, главное знать принцип решения подобных задач.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

shura1

  • Гость
Azure,
Я где-то однажды дал решение, которое состояло из фильтра, где были sed, awk и perl одновременно. Работало, но "смотрящие" сильно удивились. Объяснил. Unix - это реально гараж, с кучей всего, вот что помню, знаю, умею - тем и пользуюсь. И считаю это нормальным.

alsoijw,
По поводу перл - я реально деньги зарабатывал на нем, любимый инструмент был. Но, когда, чтоб им пользоваться в командной строке, мне приходится лепить вот такой алиас, это уже (далее нецензурно)

which perl
perl: aliased to perl -CASD -Mutf8 -M-strict -Mv5.18

Пишу 100-строчники на руби. Доволен

 

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