регулярные выражения и отрицание подстроки (как найти строку где нет подстроки А но есть строка В)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

регулярные выражения и отрицание подстроки

Сообщение Denjs »

мне надо найти все .cpp файлы но только не те, которые сгенерировал метакомпилятор QT - т.е. которые начинаются не с "moc". с регекспами я новичок потому сильно прошу помощи )))))

и так. что делает выражение ниже - вроде понятно...

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

find ./ -name '*.*' | grep -o -P '.*?/(?=moc).*?\.cpp'

ищет файлы в которых есть сначала "/moc" а потом ".cpp". (по сути в пути с файлом, но не суть)

А как найти то, где нет "/moc" но есть ".cpp"?

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

find ./ -name '*.*' | grep -o -P '.*?/(?!moc).*?\.cpp'

вываливает все. без какой-либо фильтрации. почему?

подскажите, как быть?
Заранее благодарен.


PS: А если объясните почему у меня не получается засунуть этот-же регекс в find
т.е. приведенные ниже вырабения выдают пустой результат

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

find ./ -regex ".*?/(?=moc).*?\.cpp"
find ./ -regex ".*?/(?\!moc).*?\.cpp"

- отдельное спасибо.
find никак не поддерживает перл-синтаксис?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5403
ОС: Gentoo

Re: регулярные выражения и отрицание подстроки

Сообщение /dev/random »

Denjs писал(а):
11.12.2009 02:17
PS: А если объясните почему у меня не получается засунуть этот-же регекс в find
т.е. приведенные ниже вырабения выдают пустой результат

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

find ./ -regex ".*?/(?=moc).*?\.cpp"
find ./ -regex ".*?/(?\!moc).*?\.cpp"

- отдельное спасибо.
find никак не поддерживает перл-синтаксис?

Не поддерживает.
(man find) писал(а):-regextype type
Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default), posix-awk, posix-basic, posix-egrep and posix-extended.


find -regex '.*\.cpp' ! -regex '.*/moc[^/]*'
Спасибо сказали:
strephil
Сообщения: 47
ОС: GNU

Re: регулярные выражения и отрицание подстроки

Сообщение strephil »

find, действительно, не поддерживает перл-синтаксис.

использовать find вместе с grep можно, например, так:

find . -name '*.cpp' | grep -v '.*/moc[^/]*.cpp'
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: регулярные выражения и отрицание подстроки

Сообщение t.t »

/dev/random писал(а):
11.12.2009 07:41
find -regex '.*\.cpp' ! -regex '.*/moc[^/]*'
По-моему, не тот случай, когда нужны регекспы.

Shell

find -name \*.cpp ! -name moc\*


О том, что не нужен греп, думаю, и говорить особо не стоит.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: регулярные выражения и отрицание подстроки

Сообщение Denjs »

так.. всем спасибо, конкретное решение конкретной задачи найдено и в нескольких вариантах. спасибо большое.

но! как решить задачу только средствами регулярных выражений?
приведенные выше примеры - они хотя и решают конкретную задачу но все укладывается за несколько выражений.

А как мне одним выражением найти строки имеющие подстроку А но не имеющие подстроку B ?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: регулярные выражения и отрицание подстроки

Сообщение pcodr »

А как мне одним выражением найти строки имеющие подстроку А но не имеющие подстроку B ?


$ perl -e '"moc.test.cpp" =~ /^(?!moc.).*?\.cpp$/ and warn "matched" or warn "NOT matched";'
NOT matched at -e line 1.

$ perl -e '"amoc.test.cpp" =~ /^(?!moc.).*?\.cpp$/ and warn "matched" or warn "NOT matched";'
matched at -e line 1.
remote system type is unix
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: регулярные выражения и отрицание подстроки

Сообщение drBatty »

Denjs писал(а):
12.12.2009 00:38
А как мне одним выражением найти строки имеющие подстроку А но не имеющие подстроку B ?

в sed одним - никак. можно двумя:
s/^moc/\n/; s/^[^\n].*cpp/.../
т.е. меняем подстроку B на 1 символ, а потом ищем строки без этого символа (по условию, подстрока B была в самом начале строки)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: