在我的主目录中,我有一个包含Drupal平台的文件夹drupal-6.14。
在此目录中,我使用以下命令:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
该命令的作用是gzip压缩drupal-6.14文件夹,不包括drupal-6.14 / sites /的 所有子文件夹,但site / all和sites / default除外。
我的问题是关于正则表达式的:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
该表达式可以排除我要排除的所有文件夹,但是我不太明白为什么。
使用正则表达式
匹配所有字符串,但不包含子模式x的字符串除外。或者换句话说,否定子模式。
我(认为)我知道解决这些问题的一般策略是使用否定先行,但我从未完全满意地理解过分积极和消极的行事方式。
这些年来,我已经阅读了许多网站。PHP和Python regex手册以及其他页面,例如http://www.regular-expressions.info/lookaround.html等,但是我对它们从未真正有过深刻的了解。
有人可以解释这是如何工作的,也许可以提供一些类似的例子来做类似的事情?
-更新一:
关于Andomar的回应:双重否定前瞻能否更简洁地表达为单个肯定前瞻性陈述:
即是:
'drupal-6.14/(?!sites(?!/all|/default)).*'
相当于:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
-更新二:
根据@andomar和@alan moore-您不能将双负前瞻换为正前瞻。
回首忆惘然
海绵宝宝撒
慕虎7371278
相关分类