Wyrażenie regularne ujemne spojrzenie w przód

W moim katalogu domowym mam folder drupal-6.14, który zawiera platformę Drupal.

W tym katalogu używam następującego polecenia:

find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz

To polecenie wykonuje gzips folderudrupal-6.14, z wyłączeniem wszystkich podfolderówdrupal-6.14 / sites / z wyjątkiem witryn / wszystkich i witryn / domyślnych, który zawiera.

Moje pytanie dotyczy wyrażenia regularnego:

grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'

EkspresjaPrace aby wykluczyć wszystkie foldery, które chcę wykluczyć, ale nie do końca rozumiem dlaczego.

Jest to powszechne zadanie z użyciem wyrażeń regularnych

Dopasuj wszystkie ciągi, z wyjątkiem tychnie zawierają wzór podrzędny x. Albo innymi słowy, negowanie podtekstu.

Ja (myślę) Rozumiem, że ogólną strategią rozwiązania tych problemów jest użycie negatywnych spojrzeń, ale nigdy nie zrozumiałem na zadowalającym poziomie, jak działają pozytywne i negatywne spojrzenie (z wyprzedzeniem / z tyłu).

Przez lata czytałem na nich wiele stron internetowych. Podręczniki regex PHP i Python, inne stronyhttp://www.regular-expressions.info/lookaround.html i tak dalej, ale ja nigdynaprawdę dobrze je rozumiem.

Czy ktoś mógłby wyjaśnić, jak to działa i być może podać kilka podobnych przykładów, które mogłyby zrobić podobne rzeczy?

- Aktualizacja pierwsza:

Odnośnie odpowiedzi Andomara: czy podwójny negatywny punkt odniesienia może być bardziej zwięźle wyrażony jako pojedyncze pozytywne stwierdzenie z wyprzedzeniem:

to znaczy:

'drupal-6.14/(?!sites(?!/all|/default)).*'

równoważny:

'drupal-6.14/(?=sites(?:/all|/default)).*'

??

- Aktualizacja druga:

Jak na @andomar i @alan moore - nie możesz zamienić podwójnego negatywnego nagłówka na pozytywny.

questionAnswers(3)

yourAnswerToTheQuestion