LINUX.ORG.RU
решено ФорумAdmin

Проблема с enhanced features в -regex утилиты “find”

 , ,


0

2

Здравствуйте!

Пример проблемы:

: > 12; basename $(find -E . -regex '^(.*)(\d{2})' -print 2>/dev/null) не находит файл, basename $(find -E . -regex '^(.*)([0-9]{2})' -print 2>/dev/null) находит

В то же время, для примера, echo -e '12\nabc\n456' | grep -E -e '^(\d{3})' успешно справляется с задачей, хотя, по-видимому использует тот же regcomp()

Вопрос: что я делаю не так, и как победить (где что подкрутить)?

Заранее благодарен за помощь!

P.S. OS X, маны: regcomp(3), re_format(7), find(1)

UPD:

gfind . -regextype 'egrep' -regex '^(.*)(\d{2})' -print 2>/dev/null так же не работает, как впрочем и с любыми другими regular expression type



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

Ты традиционно для ЛОРа начал сходу прям, вообще без разминки описывать свои фантазии на тему решения какой-то задачи, при этом ни слова не говоря о самой задачи
Молодец, моя школа

zolden ★★★★★
()

Вообще-то в приведённых тобой манах всё написано прямым текстом : '\d' - это «enhanced feature», которые find никак не поддерживает (-E - это Extended). В gnu-утилитах это называется Perl-style, и есть в grep, но нет в find.

ABW ★★★★★
()
Последнее исправление: ABW (всего исправлений: 1)
Ответ на: комментарий от zolden

Простите, если это вы мне, то я не знаю что такое ЛОР (Linux.Org.Ru)? Задача же простая — не работает то, что я описал выше, требуется помощь для исправления ситуации.

Cave-Canem
() автор топика
Ответ на: комментарий от ABW

'\d' - это «enhanced feature», которые find никак не поддерживает

1.В re_format(7) сказано, что:

When the REG_ENHANCED flag is passed to one of the regcomp() variants, additional features are activated.

Таким образом надо как-то установить REG_ENHANCED flag

2. gfind так же не работает, см. UPD в заглавном посте

Cave-Canem
() автор топика

не находит файл
находит

Я вот нифига вопроса не увидел. Если решение есть, то вы сюда за OS X похвастаться пришли?

anc ★★★★★
()
Ответ на: комментарий от Cave-Canem

Таким образом надо как-то установить REG_ENHANCED flag

Берешь исходник и патчишь

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

Ну как же нет вопроса? Не работают enhanced feature, может кто знает как включить?

Чем хвастаться? OS как OS, а отметил я этот факт только потому, что в OS X другая реализация find.

Впрочем, gfind так же не работает.

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

а отметил я этот факт только потому, что в OS X другая реализация find.

Вы впервые заметили разницу между BSD и GNU утилит?

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

1. PCRE это [Perl ? Regular Expression]?

2. gfind так же не поддерживает enhanced basic and enhanced extended REs (EBRE и EERE)?

3. egrep при этом поддерживает EBRE и EERE?

4. Где взять исходник?

Cave-Canem
() автор топика
Ответ на: комментарий от deadNightTiger

egrep=grep -E, т. е. ERE

Так вот echo -e '12\nabc\n456' | grep -E -e '^(\d{3})' отлично работает

За ссылку на исходники Бльшое Спасибо!

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

Так вот возвращаемся к моему первому вопросу. Если у вас есть готовое решение, нафейхуа вы мозг здесь нам парите?
И кстати даже самому себе тоже? Реализация не позволяет того что вы хотите, используйте то что работает.

anc ★★★★★
()
Ответ на: комментарий от Cave-Canem

Так вот echo -e '12\nabc\n456' | grep -E -e '^(\d{3})' отлично работает

В тему вашего бреда. У меня отлично НЕ работает на 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:26:45 PDT 2012; root:xnu-1699.32.7~1/RELEASE_I386 i386

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

Вежливый вы наш!

В тему ВАШЕГО бреда:

echo -e '12\nabc\n456' | grep -E -e '^(\d{3})'
456

«IOKitBuildVersion» = «Darwin Kernel Version 13.4.0: Mon Jan 11 18:17:34 PST 2016; root:xnu-2422.115.15~1/RELEASE_X86_64»

GNU bash, версия 4.4.0(1)-release (x86_64-apple-darwin13.4.0)

grep --version
grep (BSD grep) 2.5.1-FreeBSD

Cave-Canem
() автор топика
Ответ на: комментарий от anc

Юноша, у меня НЕТ ГОТОВОГО РЕШЕНИЯ, я просто хочу понять, как я могу воспользоваться целым классом «Enhanced basic and Enhanced extended REs», который описан в re_format(7), который, в свою очередь, поставляется вместе с OS.

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

Зашибись, все больше и больше вводных, дошли уже и до версий где работает/не-работает. И все-таки вы ответите на вопрос:
«Так вот возвращаемся к моему первому вопросу. Если у вас есть готовое решение, нафейхуа вы мозг здесь нам парите? »

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

«Так вот возвращаемся к моему первому вопросу. Если у вас есть готовое решение, нафейхуа вы мозг здесь нам парите? »

Кому «нам»? Мы, Николай II? Персонально вас кто-то заставляет это читать и в хамском тоне отвечать?

По сути:

У меня есть решение для ЧАСТНОГО случая и нет решения для работы с целым классом «Enhanced basic and Enhanced extended REs», который описан в re_format(7), который, в свою очередь, поставляется вместе с OS.

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

1. Вы описываете именно частный случай, который решаем согласно вашему же утверждению.
2. Версионность. Было бы еще понятно когда вы написали бы - «раньше работало теперь перестало». По факту оно не работает, но есть другие варианты смотрим пункт один.
Итого: «Вы пытаетесь спросить почему оно не работает, хотя в мане написано другое, при это сами же нашли строку про REG_ENHANCED flag»
Ну не работает, перепишите код что бы у вас работало. Или как уже советовали поправьте исходники, только потом не удивляетесь что при очередном обновлении все ваши скрипты могут превратиться в тыкву.
ЗЫ Вы хотите на лор добиться ответа на вопрос почему не работает на os x и именно такая конструкция? Ну отвечу, идите на макфак.

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