Test и regexp

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
redhat
рядовой
Сообщения: 41
Зарегистрирован: 2010-01-04 9:45:34
Откуда: Киев

Test и regexp

Непрочитанное сообщение redhat » 2012-09-22 16:30:55

Добрый день коллеги, стоит задача проверить, соответствует ли полученное значение регулярному выражению.
В идеале должно выглядеть так

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

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\}\)\$
Ведет себя правильно.
Что делать, коллеги?

Хостинговая компания 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/

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

Re: Test и regexp

Непрочитанное сообщение kpp » 2012-09-22 18:03:07

$reader всегда возвращает число в формате "111111 11" или "11111 11" ?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
redhat
рядовой
Сообщения: 41
Зарегистрирован: 2010-01-04 9:45:34
Откуда: Киев

Re: Test и regexp

Непрочитанное сообщение redhat » 2012-09-22 18:15:40

kpp писал(а):$reader всегда возвращает число в формате "111111 11" или "11111 11" ?
Да, опечатался символом. $reader возвращает результат сканирования штрихкода в формате (6 цифр) пробел (2 цифры) ну или длинный эррор, если распознать не удалось.

rayder
лейтенант
Сообщения: 661
Зарегистрирован: 2008-12-18 16:29:43
Откуда: Ukraine/Kiev
Контактная информация:

Re: Test и regexp

Непрочитанное сообщение rayder » 2012-09-22 20:35:14

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

echo -e "12345 66\n11 21\n12345677\n12366 55"  | egrep -qe \^\(\[0-9\]\{5\}\)\ \(\[0-9\]\{2\}\)\$
if [ $? -eq 0 ]
не подойдет?
Человеку свойственно ошибаться, но для нечеловеческих ляпов нужен компьютер.

Аватара пользователя
redhat
рядовой
Сообщения: 41
Зарегистрирован: 2010-01-04 9:45:34
Откуда: Киев

Re: Test и regexp

Непрочитанное сообщение redhat » 2012-09-22 21:21:34

Спасибо. То что надо!

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

Re: Test и regexp

Непрочитанное сообщение kpp » 2012-09-23 9:01:43

[[ - это примочка баша. Почему не работает - непонятно, самому стало интересно.

Зачем так много экранов?

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

echo -e "12345 66\n11 21\n12345677\n12366 55"  | grep -E "^[0-9]{5} [0-9]{2}$"
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
redhat
рядовой
Сообщения: 41
Зарегистрирован: 2010-01-04 9:45:34
Откуда: Киев

Re: Test и regexp

Непрочитанное сообщение redhat » 2012-09-24 8:52:03

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

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

Re: Test и regexp

Непрочитанное сообщение kpp » 2012-09-24 9:44:29

Вот на хардкоре и прогорел и меня в заблужение ввел ;)
Вот так работает:

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

#!/usr/local/bin/bash

reader="11111 11"
regexp="^[0-9]{5}\ [0-9]{2}$"
if [[ "${reader}" =~ "${regexp}" ]]
....
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
redhat
рядовой
Сообщения: 41
Зарегистрирован: 2010-01-04 9:45:34
Откуда: Киев

Re: Test и regexp

Непрочитанное сообщение redhat » 2012-09-24 15:39:15

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)

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

Re: Test и regexp

Непрочитанное сообщение kpp » 2012-09-24 16:17:20

В строке кавычки лишние

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

if [[ "${reader}" =~ ${regexp} ]]
По памяти писал, промахнулся ;)
Ну и по хорошему код форматировать нужно, для удобоваримости. :roll:
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.