LINUX.ORG.RU
ФорумAdmin

Как использовать переменную в регулярном выражении?

 


0

1

Привет друзья. Имеется регулярное выражение в команде вида:

echo 'hello world' | grep -oP 'hello \K(world)'
Как сделать, чтобы в регулярном выражении вместо текста hello я мог использовать переменную $hello? Т.к. если подставлять переменную вместо текста, то регулярное выражение перестаёт работать.



Последнее исправление: xaizek (всего исправлений: 1)

echo ‘hello world’ | grep -oP "${hello} \K(world)"

dexpl ★★★★★
()

Чтобы результатом пайпа была какая-то строка, нужно чтобы переменная $hello содержала какую-то подстроку из строки hello world. Тогда пример @dexpl будет работать.

kardjoe
()
Последнее исправление: kardjoe (всего исправлений: 1)

А вообще, в bash есть встроенный regex, для которого не обязательно вызывать нестандартизированный perl-regex в grep. И сразу получим результат в переменной и без всяких пайпов.

$ hello=XXX
$ [[ "XXX world" =~ "$hello "([[:alnum:]]*) ]]
$ echo ${BASH_REMATCH[1]}
world

vodz ★★★★★
()
Ответ на: комментарий от anonymous

на UNIX System V Release 3.2 нет bash, не портабельно

У человека есть ТЗ, написать на bash. В современном мире если нет bash-а, то либо его поставят, либо такое ТЗ не будет. А вот grep-а с pcre надо оговаривать отдельно. ТС вроде уже третий топик создаёт на эту задачу, отказывающийся от правильного ответа, заключающегося в том, что если надо разбивать на слова (см его regex), то для этого изобретен awk, где нет проблем с переменными и прочими вычислениями третьего слова (см соседний топик). Упорно талдычит свой grep. Ну так пусть и пишет, что в задаче стоит не bash, а как сделать только на основе grep.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Спасибо за помощь и внимание к моей проблеме. Указанное регулярное выражение я использую чтобы оставить текст только между определёнными символами. Допустим у меня строка в которой надо оставить только текст между символами W и Y, можете подсказать как это более эффективно реализуется через awk?

dualCore
() автор топика
Ответ на: комментарий от dualCore

Допустим у меня строка

У вас ровно одна строка или целый файл на входе и соответственно на выходе?

в которой надо оставить только текст между символами W и Y

Это уникальные символы в строке?

vodz ★★★★★
()
Ответ на: комментарий от vodz

На входе у меня набор текста, чаще всего это код веб страницы. На выходе у меня строка или несколько строк, из которых отсеян ненужный текст. Вот самая первая моя задача для которой мне как раз и подсказали решение с pcre
Задача получить в bash вывод со страницы https://www.postgresql.org/ftp/source/ , где содержались только бы номера версий ПО и ничего более.
Вот так я решаю эту задачу: curl -s https://www.postgresql.org/ftp/source/ | grep -Po 'alt=«v\K.*?(?=»)'
Т.е. оставляю только вывод который находится между alt=«v и » Как вы предлагаете решать такие задачи через awk?

dualCore
() автор топика
Ответ на: комментарий от dualCore

где содержались только бы номера версий ПО и ничего более.

Так что ли?

curl -s https://www.postgresql.org/ftp/source/ | grep -o 'href="v[0-9.]\+/"' | grep -o 'v[0-9.]\+'
wandrien ★★
()
Ответ на: комментарий от dualCore

Логичнее взять инструмент для xml/html, и работать с XPath.

К примеру xpup или xmllint.

На самом деле куда лучше взять тот же python, но если именно shell нужен то специализированная утилита спасёт от кучи неведомых багов.

WoozyMasta
()
Ответ на: комментарий от dualCore

На входе у меня набор текста, чаще всего это код веб страницы.

Не надо вилять. html — совсем другое дело.

Как вы предлагаете решать такие задачи через awk?

Берете на слабо? Да нате.

curl -s https://www.postgresql.org/ftp/source/ | xmllint --html --xpath html/body/div/div/div/div/div/table/tr/td  - 2> /dev/null | awk  -vRS='>' '$1=="<a" && /href=.?v[0-9.]+\// { v=gensub(/href=.?(v[0-9.]+)\/.*/, "\\1", "g", $2); if(va[v]==0) { va[v]=1; print v;} }'

vodz ★★★★★
()
Ответ на: комментарий от vodz

Парсинг XMLя регуляркой сразу после примения XPath? Осталось всунуть это в продакшн, написать немного лирики и можно слать в TheDailyWTF.

t184256 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.