在我的主目录中,我有一个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
Run Code Online (Sandbox Code Playgroud)
这个命令的作用是gzips文件夹drupal-6.14,不包括drupal-6.14/sites/ 除了sites/all和sites/default之外的所有子文件夹.
我的问题是关于正则表达式:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
该表达式可以排除我想要排除的所有文件夹,但我不太明白为什么.
使用正则表达式是一项常见任务
匹配所有字符串,但不包含子模式x的字符串除外.或者换句话说,否定子模式.
我(想)我明白解决这些问题的一般策略是使用否定的前瞻,但我从来没有理解到正面和负面的外观(前瞻/后退)是如何工作的.
多年来,我已经阅读了很多网站.PHP和Python正则表达式手册,其他页面,如http://www.regular-expressions.info/lookaround.html等,但我从来没有真正理解它们.
有人可以解释,这是如何工作的,也许可以提供一些类似的例子来做类似的事情?
- 更新一:
关于Andomar的回应:双重否定前瞻可以更简洁地表达为单一的积极前瞻性陈述:
即是:
'drupal-6.14/(?!sites(?!/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
相当于:
'drupal-6.14/(?=sites(?:/all|/default)).*'
Run Code Online (Sandbox Code Playgroud)
???
- 更新二:
根据@andomar和@alan moore - 你不能互换双负前瞻以获得积极的前瞻.