В моем домашнем каталоге есть папка drupal-6.14, содержащая платформу Drupal.
Из этого каталога я использую следующую команду:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
Эта команда сжимает папку drupal-6.14, исключая все подпапки drupal-6.14 / sites / кроме sites / all и sites / default strong >, который в него входит.
У меня вопрос по регулярному выражению:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Выражение работает для исключения всех папок, которые я хочу исключить, но я не совсем понимаю почему.
Это обычная задача с использованием регулярных выражений для
Соответствуют всем строкам, кроме тех, которые не содержат подшаблон x. Или, другими словами, отрицание подшаблона.
Я (думаю) я понимаю, что общая стратегия решения этих проблем заключается в использовании отрицательного взгляда вперед, но я никогда не понимал на удовлетворительном уровне, как работают положительный и отрицательный взгляд (вперед / назад).
За прошедшие годы я прочитал о них на многих сайтах. Руководства по регулярным выражениям PHP и Python, другие страницы, например http://www.regular-expressions.info/lookaround.html и т. д., но я никогда по-настоящему не понимал их.
Может ли кто-нибудь объяснить, как это работает, и, возможно, предоставить аналогичные примеры, которые будут делать аналогичные вещи?
- Обновление одно:
Что касается ответа Андомара: можно ли более кратко выразить двойной отрицательный прогноз в виде одного утверждения положительного просмотра вперед:
i.e Is:
'drupal-6.14/(?!sites(?!/all|/default)).*'
эквивалент:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
- Обновление два:
Согласно @andomar и @alan moore - вы не можете поменять местами двойной отрицательный взгляд вперед на положительный взгляд вперед.