私のホームディレクトリには、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
このコマンドは、drupal-6.14フォルダーをgzipします。ただし、sites/allとsites/defaultを除くdrupal-6.14/sites/ のすべてのサブフォルダーは除外されます。
私の質問は正規表現についてです:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
この式は、除外したいすべてのフォルダーを除外するように機能しますが、その理由はよくわかりません。
正規表現を使用して
サブパターンxを含まない文字列を除くすべての文字列に一致します。つまり、サブパターンを否定します。
私は、これらの問題を解決するための一般的な戦略はネガティブな先読みの使用であることを理解していますが、ポジティブおよびネガティブな先読み(前/後ろ)がどのように機能するかを満足のいくレベルまで理解したことはありません。
何年にもわたって、私はそれらの多くのウェブサイトを読みました。PHPとPythonの正規表現のマニュアル、http://www.regular-expressions.info/lookaround.htmlなどの他のページなどですが、私はそれらを完全に理解したことはありません。
誰かがこれがどのように機能しているかを説明し、おそらく同様のことを行ういくつかの同様の例を提供できますか?
--アップデート1:
Andomarの応答について:二重否定の先読みは、単一の正の先読みステートメントとしてより簡潔に表現できますか。
すなわち:
'drupal-6.14/(?!sites(?!/all|/default)).*'
に相当:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
--アップデート2:
@andomarと@alanmooreによると、二重否定の先読みを正の先読みと交換することはできません。