В моем домашнем каталоге у меня есть папка 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
Что делает эта команда, это gzips папка drupal-6.14, исключая все подпапки drupal-6.14/sites/ кроме сайтов /all и sites/default, которые она включает.
Мой вопрос заключается в регулярном выражении:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Выражение работает, чтобы исключить все папки, которые я хочу исключить, но я не совсем понимаю, почему.
Это обычная задача, использующая регулярные выражения для
Сопоставьте все строки, кроме тех, что не содержат подшаблон x. Или, другими словами, отрицание подшаблона.
Я (думаю) Я понимаю, что общая стратегия решения этих проблем - использование негативных взглядов, но я никогда не понимал удовлетворительного уровня, как работает позитивный и негативный внешний вид (вперед/назад).
На протяжении многих лет я читал на них множество веб-сайтов. Регулярные руководства PHP и Python, другие страницы, такие как http://www.regular-expressions.info/lookaround.html и т.д., Но я никогда не был действительно твердое понимание их.
Может кто-нибудь объяснить, как это работает, и, возможно, предоставить некоторые аналогичные примеры, которые будут делать похожие вещи?
- Обновить один:
Относительно ответа Andomar: может ли двойной негативный взгляд быть более кратко выражен как одно положительное выражение:
i.e:
'drupal-6.14/(?!sites(?!/all|/default)).*'
эквивалентно:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
- Обновить два:
В соответствии с @andomar и @alan moore - вы не можете обменивать двойной негативный прогноз для позитивного просмотра.