2016-11-29 4 views
0

gitで検索を実行して、ローカルまたはコンポーネントの2つのフォルダのいずれかですべてのステージングされたファイルを取得しようとしています。私はJSファイルを取得したいだけです。コマンドはコンソールで実行されます。正規表現の先頭が

STAGED_FILES=($(git diff --cached --name-only --diff-filter=ACM | grep "^(local|components).*?.js")) 

これは私のすべての段階的なファイルを取得します:私はこれまで持っているもの

git diff --cached --name-only --diff-filter=ACM 

これは私のローカルまたはコンポーネント

grep "^(local|components)" 

で始まるすべてのファイルのパスを取得しますそして、これは私にすべてのjsファイルを取得します

grep ".js" 

そして、これは私にいくつかの理由のために何も返さない:

($(git diff --cached --name-only --diff-filter=ACM | grep "^(local|components).*?.js")) 

私はそれを検索することができます正規表現は私にこれらの2つのフォルダ内のすべてのJSファイルになるだろうとは何ですか?

答えて

4

grep?遅延一致をサポートしていないため、機能しませんでした。拡張正規表現には-Eを使用できます。それは文字列の中でも?を一致させようとします-Eずにあなたが見ることができるように例えば

は、これらの

$ echo "asfasdfzasdfasdfz" | grep -E "a.*?z" 
asfasdfzasdfasdfz 
$ echo "asfasdfzasdfasdfz" | grep "a.*?z" 
$ echo "asfasdfzasdfasdf?z" | grep "a.*?z" 
asfasdfzasdfasdf?z 

を検討してください。

+0

私はそれを知りませんでした! – SoluableNonagon

+0

@ SoluableNonagonあなたは大歓迎です:) – nu11p01n73R

2

正規表現ベースの回答に加えて、あなたはシェルスタイルのグロブを含む「PATHSPEC」の概念を持っているのGit、直接これを行うことができます:

git diff --cached --name-only \ 
    --diff-filter=ACM -- 'local/**/*.js' 'components/**/*.js' 

を(書式設定の表示のために破線;ことに注意してください**のサポートはGitバージョン1.8.2の新機能です)。

つまり、正規表現はシェルグロブよりも「強力」なので、nu11p01n73R's answerを念頭に置いてください。ただし、その非欲張りマッチ(*?)試合できるだけとしてではなく、可能な限り少し、として:(とにかく、拡張解釈で)

pattern  input  result (matched part in parentheses) 

abc.*e  0abcdefeged  0(abcdefege)d 
abc.*?e 0abcdefeged  0(abcde)feged 
abc.*d  0abcdefeged  0(abcdefeged) 
abc.*?d 0abcdefeged  0(abcd)efeged 

あなたの表現、^(local|components).*?.js、言う:マッチ行の開始;リテラルテキストとしてlocalまたはcomponentsに一致させます。可能な限り少数の文字にマッチします。任意の文字にマッチします。リテラルjと一致します。リテラルsと一致します。したがって、これはlocalで始まり、テキストを含んでおり、jsの前に1文字多くなり、続けているため、local-jaguar-xjs-vehiclesと一致します。

任意数おそらくゼロのサブディレクトリ構成要素、名前文字通りマッチドットと、.jsで終わるファイルが続く続くシェルグロブパターンlocal/**/*.jsマッチのみディレクトリlocal、。これは、パターン^local/(.*/|)[^/]*\.js$と同じです。リテラルテキストlocalが行頭にマッチし、その後に1つのスラッシュが続きます。スラッシュで終わる任意の数の文字(できるだけ多くの文字を取ります)、まったく何もありません。その後にスラッシュを除く任意の文字(何も含まない)が続き、その後にリテラル.jsが続き、行の終わりが続きます。

この式は(行の先頭終わりに一致している必要があります)両端に固定され、一つだけKleene star途中でがあるされているので、私たちが貪欲または非を使用するかどうかは関係ありませんのでご注意欲張りのマッチ:左のアンカーは左と右のアンカーが右にマッチし、欲張りのマッチはできるだけ多くの中点をとります。つまり、貪欲なマッチは中くらいは少しとなります... まだまだ「全て」です。

(これはもちろん、ファイル名が各行に1つだけ表示されていることを前提としていますが、幸いにもgit diff --name-onlyはこれを行います。また、 "任意の数のディレクトリ"のシェル**は、すべての非シェルファイル名グロビングはありませんが、pathspecs(pathspecを検索)でです。

+0

これは実際には大いに役立ちます。ありがとうございました。 – SoluableNonagon