KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
In my home directory I have a folder drupal-6.14 that contains the Drupal platform. From this directory I use the following command: find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz What this command does is gzips the folder drupal-6.14 , excluding all subfolders of drupal-6.14/sites/ except sites/all and sites/default , which it includes. My question is on the regular expression: grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' The expression works to exclude all the folders I want excluded, but I don't quite understand why. It is a common task using regular expressions to Match all strings, except those that don't contain subpattern x. Or in other words, negating a subpattern. I (think) I understand that the general strategy to solve these problems is the use of negative lookaheads, but I've never understood to a satisfactory level how positive and negative look(ahead/behind)s work. Over the years, I've read many websites on them. The PHP and Python regex manuals, other pages like http://www.regular-expressions.info/lookaround.html and so forth, but I've never really had a solid understanding of them. Could someone explain, how this is working, and perhaps provide some similar examples that would do similar things? -- Update One: Regarding Andomar's response: can a double negative lookahead be more succinctly expressed as a single positive lookahead statement: i.e Is: 'drupal-6.14/(?!sites(?!/all|/default)).*' equivalent to: 'drupal-6.14/(?=sites(?:/all|/default)).*' ???
Tags (comma-separated)
Save Edits
Cancel