Страница 1 из 1
Test и regexp
Добавлено: 2012-09-22 16:30:55
redhat
Добрый день коллеги, стоит задача проверить, соответствует ли полученное значение регулярному выражению.
В идеале должно выглядеть так
Код: Выделить всё
regexp='\^\(\[0-9\]\{5\}\)\ \(\[0-9\]\{2\}\)\$'
if [[ "$reader" =~ "$regexp" ]]
....
$reader всегда возвращает число в формате "111111 11"
Но такая проверка дает false хотя
Код: Выделить всё
echo -e "12345 66\n11 21\n12345677\n12366 55" | egrep -e \^\(\[0-9\]\{5\}\)\ \(\[0-9\]\{2\}\)\$
Ведет себя правильно.
Что делать, коллеги?
Re: Test и regexp
Добавлено: 2012-09-22 18:03:07
kpp
$reader всегда возвращает число в формате "111111 11" или "11111 11" ?
Re: Test и regexp
Добавлено: 2012-09-22 18:15:40
redhat
kpp писал(а):$reader всегда возвращает число в формате "111111 11" или "11111 11" ?
Да, опечатался символом. $reader возвращает результат сканирования штрихкода в формате (6 цифр) пробел (2 цифры) ну или длинный эррор, если распознать не удалось.
Re: Test и regexp
Добавлено: 2012-09-22 20:35:14
rayder
Код: Выделить всё
echo -e "12345 66\n11 21\n12345677\n12366 55" | egrep -qe \^\(\[0-9\]\{5\}\)\ \(\[0-9\]\{2\}\)\$
if [ $? -eq 0 ]
не подойдет?
Re: Test и regexp
Добавлено: 2012-09-22 21:21:34
redhat
Спасибо. То что надо!
Re: Test и regexp
Добавлено: 2012-09-23 9:01:43
kpp
[[ - это примочка баша. Почему не работает - непонятно, самому стало интересно.
Зачем так много экранов?
Код: Выделить всё
echo -e "12345 66\n11 21\n12345677\n12366 55" | grep -E "^[0-9]{5} [0-9]{2}$"
Re: Test и regexp
Добавлено: 2012-09-24 8:52:03
redhat
Только экранирование! Только хардкор!
Тоже интересно, почему не скушало. Наверное тоже какая-то фича баша.
Re: Test и regexp
Добавлено: 2012-09-24 9:44:29
kpp
Вот на хардкоре и прогорел и меня в заблужение ввел

Вот так работает:
Код: Выделить всё
#!/usr/local/bin/bash
reader="11111 11"
regexp="^[0-9]{5}\ [0-9]{2}$"
if [[ "${reader}" =~ "${regexp}" ]]
....
Re: Test и regexp
Добавлено: 2012-09-24 15:39:15
redhat
kpp писал(а):Вот на хардкоре и прогорел и меня в заблужение ввел

Вот так работает:
Код: Выделить всё
#!/usr/local/bin/bash
reader="11111 11"
regexp="^[0-9]{5}\ [0-9]{2}$"
if [[ "${reader}" =~ "${regexp}" ]]
....
Магия
Код: Выделить всё
[root@dataserver tmp]# cat test.sh
#!/bin/bash
reader="11111 11"
regexp="^[0-9]{5}\ [0-9]{2}$"
if [[ "${reader}" =~ "${regexp}" ]]; then echo "1 work!"; else echo "1 not work"; fi
echo -e "$reader" | egrep -qe \^\(\[0-9\]\{5\}\)\ \(\[0-9\]\{2\}\)\$
if [ $? -eq 0 ]; then echo "2 work!"; else echo "2 not work"; fi
Код: Выделить всё
[root@dataserver tmp]# ./test.sh
1 not work
2 work!
Код: Выделить всё
[root@dataserver tmp]# bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Re: Test и regexp
Добавлено: 2012-09-24 16:17:20
kpp
В строке кавычки лишние
По памяти писал, промахнулся

Ну и по хорошему код форматировать нужно, для удобоваримости.
