Страница 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
Re: Регулярка для Sed
Добавлено: 2013-01-08 18:00:41
skipper
м.б. это можно сделать чем-то другим, кроме 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'у
