Страница 1 из 1

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

Добавлено: 2013-01-08 17:42:09
skipper
Вечер добрый.
Из строки типа "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

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

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

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

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

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

Добавлено: 2013-01-08 22:07:28
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

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

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

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

echo "15 aaaaa.sh /data/a/b/c/i_ges.php >> /dev/null" | sed 's|.*\(\([^\/]*\/\)\{1,\}[^ ]*\) .*|\1|'

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

Добавлено: 2013-01-09 9:50:36
skipper
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", т.е. .* съедает все до последнего слэша, а не до первого (так же как и в моем варианте, первый пост).

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

Добавлено: 2013-01-09 11:13:06
kpp
Найдите одно отличие ;)

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

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

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

Добавлено: 2013-01-09 11:28:27
kpp
Вообще говоря, для избавления от проблем в дальнейшем, пути принято оборачивать в кавычки, в этом случае:

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

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

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

Добавлено: 2013-01-09 11:57:44
skipper
kpp писал(а):Вообще говоря, для избавления от проблем в дальнейшем, пути принято оборачивать в кавычки, в этом случае:

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

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

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

Добавлено: 2013-01-09 12:29:44
kpp
Так бы сразу:

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

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

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

Добавлено: 2013-01-09 15:07:33
skipper
kpp писал(а):Так бы сразу:

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

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