Регулярка для Sed

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
skipper
рядовой
Сообщения: 23
Зарегистрирован: 2009-12-07 18:59:11
Контактная информация:

Регулярка для Sed

Непрочитанное сообщение skipper » 2013-01-08 17:42:09

Вечер добрый.
Из строки типа "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" нужно выдирать полные пути к файлам типа "\/.*\.php"
Как это сделать через sed или любую другую утилиту?

Сам мучаюсь над, который почему-то выводит только все после последнего слэша.

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|.*\(\/.*\.php\).*|\1|'
Начинаю сомневаться, что это можно сделать через sed ...

help plz

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

Re: Регулярка для Sed

Непрочитанное сообщение Bayerische » 2013-01-08 17:58:16

http://forum.lissyara.su/viewtopic.php?f=32&t=38475
Похожая проблема. Звёздочка жрёт всё до конца.

Аватара пользователя
skipper
рядовой
Сообщения: 23
Зарегистрирован: 2009-12-07 18:59:11
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение skipper » 2013-01-08 18:00:41

Bayerische писал(а):http://forum.lissyara.su/viewtopic.php?f=32&t=38475
Похожая проблема. Звёздочка жрёт всё до конца.
м.б. это можно сделать чем-то другим, кроме sed'а?

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение kpp » 2013-01-08 22:07:28

Для данного случая:

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|\([^ ]* \)\{2\}\([^ ]*\).*|\2|'
echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | awk '{print $3}'
echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | cut -d" " -f3
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение kpp » 2013-01-08 22:20:25

Предыдущие варианты основаны на предположении, что искомый полный путь всегда находится в 3-м столбце.
Вариант, если нельзя привязываться к номеру столбца:

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|.*\(\([^\/]*\/\)\{1,\}[^ ]*\) .*|\1|'
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
skipper
рядовой
Сообщения: 23
Зарегистрирован: 2009-12-07 18:59:11
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение skipper » 2013-01-09 9:50:36

kpp писал(а):Для данного случая:

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|\([^ ]* \)\{2\}\([^ ]*\).*|\2|'
echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | awk '{print $3}'
echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | cut -d" " -f3
не вариант, к номеру столбца никак не привяжешся
kpp писал(а):Предыдущие варианты основаны на предположении, что искомый полный путь всегда находится в 3-м столбце.
Вариант, если нельзя привязываться к номеру столбца:

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|.*\(\([^\/]*\/\)\{1,\}[^ ]*\) .*|\1|'
это рагулярка вырезает только "/i_ges.php", а не "/data/a/b/c/i_ges.php", т.е. .* съедает все до последнего слэша, а не до первого (так же как и в моем варианте, первый пост).

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение kpp » 2013-01-09 11:13:06

Найдите одно отличие ;)

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|.* \(\([^\/]*\/\)\{1,\}[^ ]*\) .*|\1|'
Условия такие: с двух сторон должны быть пробелы, в пути не должно быть пробелов.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение kpp » 2013-01-09 11:28:27

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

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

echo '15 aaaaa.sh "/data/a/b/c/i_ges.php" >> /dev/null' | sed 's|.*"\(\([^\/]*\/\)\{1,\}[^"]*\)".*|\1|'
Если путь обернут в двойные кавычки, в пути допустимы и пробелы и кирилица.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
skipper
рядовой
Сообщения: 23
Зарегистрирован: 2009-12-07 18:59:11
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение skipper » 2013-01-09 11:57:44

kpp писал(а):Вообще говоря, для избавления от проблем в дальнейшем, пути принято оборачивать в кавычки, в этом случае:

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

echo '15 aaaaa.sh "/data/a/b/c/i_ges.php" >> /dev/null' | sed 's|.*"\(\([^\/]*\/\)\{1,\}[^"]*\)".*|\1|'
Если путь обернут в двойные кавычки, в пути допустимы и пробелы и кирилица.
нужно из крона выдрать пути к php файлам, там кавычки будут лишними

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение kpp » 2013-01-09 12:29:44

Так бы сразу:

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

sed -n '/^[ <-->]*#/!s|.*[ <--->]\(\([^\/]*\/\)\{1,\}[^\.]*\.php\).*|\1|p' /etc/crontab
<--> - табуляция
Закомментаренные строки пропускаются.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
skipper
рядовой
Сообщения: 23
Зарегистрирован: 2009-12-07 18:59:11
Контактная информация:

Re: Регулярка для Sed

Непрочитанное сообщение skipper » 2013-01-09 15:07:33

kpp писал(а):Так бы сразу:

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

sed -n '/^[ <-->]*#/!s|.*[ <--->]\(\([^\/]*\/\)\{1,\}[^\.]*\.php\).*|\1|p' /etc/crontab
<--> - табуляция
Закомментаренные строки пропускаются.
большое спасибо, это то, что нужно
Надо бы перечитать мануал по sed'у :)