LINUX.ORG.RU

регулярные выражения


0

1

в общем это моя самая не любимая тема, но тем не менее.

не могу заставить grep понять мое регулярное выражение, вот такое:

if echo $1 | grep -q \<0x[a-z0-9]+\> ; then echo hex ; fi
if echo $1 | grep -q \<[0-9]+\> ; then echo dec ; fi

должен понимать параметр 0xabcdef1234567890 или просто 1234567890 и выдавать соответствующее сообщение.

★★★

if echo $1 | egrep -q '\<0x[[:xdigit:]]+\>'; then
    echo "hex"
elif echo $1 | egrep -q '\<[[:digit:]]+\>'; then
    echo "dec"
else
    echo "something else"
fi
beastie ★★★★★
()

Ещё няшен флаг -P (perl-regex), но не во всех grep'ах есть.

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

-E нагляднее и компактнее, чем экранировать несколько символов.

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

Ассершены тут чтобы матчить только на границах слов, т.е. сейчас например 150xdeadbeef, ab11 и 11ab дадут «something else». Нужно/ненужно — тебе решать.

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

все понятно, я знал, для чего угловые скобки, только не догонял, для чего их экранировать.

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

«Век живи - век учись, сказал поручик Ржевский...»
Не мог ли бы ты кинуть прямую ссылку?
А то BSD под рукой нет, а в том, что быстро гуглится (man из FreeBSD и MirBSD) никаких упоминаний о таком использовании, только спецклассы «[:<:]». (Не говоря уже о POSIX).

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

Хм, да это и правда нестандартная хрень. Описана в маковском re_format и похоже в любом grep(1).
Пардонтье, сам не знал, хотя еще не видел того места, где бы не работало.

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

Ага, я тоже полез в grep(1) вместо обычного (1p) и увидел, и даже вспомнил, что видел и раньше, но почему-то посчитал perl-расширением (наверное, из-за соседства c \w \W).

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