このgrepに問題がありますか?

このgrepに問題がありますか?
> output2.txt
cd # some directory i'm trying to search
find views/shared -type f -name "*.js" -print0 | while IFS= read -r -d $'\0' line; do
    echo -n "${line%.js}" | tee -a ~/Documents/counter/output2.txt
    grep -lr "${line%.js}" . | wc -l | tee -a ~/Documents/counter/output2.txt   # produce a count of occurrences
    regex='[a-zA-Z]+.extend'
    grep -f $line $regex
    grep -lr "${line%.js}" . | tee -a ~/Documents/counter/output2.txt           # produce a list of occurrences
done

商品を返す

grep: brackets ([ ]) not balanced

オンラインで見たすべての例は、ここに問題がないことを示しているようで、混乱しています。

角かっこは確かにバランスを取っていませんか?

答え1

あなたの質問は-fオプションです。検索するファイルを指定する代わりに、-fパターンリストを読み取るファイルを指定してください。 OS X grepのマニュアルページでこれについて説明します。わからない:

 -f file, --file=file
         Read one or more newline separated patterns from file.  Empty pattern lines match every input
         line.  Newlines are not considered part of a pattern.  If file is empty, nothing is matched.

GNU grepのヘルプは実際には簡単です。

$ grep --help | grep -- '-f,'
  -f, --file=FILE           obtain PATTERN from FILE
$ 

-fGNU grepのマニュアルページによると、この動作は次のようになります。specified by POSIX.

あなたの修正はあなたの回線を変更することです。

grep -f $line $regex

到着する:

egrep "$regex" -- "$line"
  • 拡張正規表現を使用しているので、egrepまたはgrep -E
  • これにより、変数のすべてのオプションが解析されるのを--防ぎます。たとえば、 ""という名前のファイルからユーザーを保護します。grep$line-r funnyname.js

答え2

grepのパイプに入る入力に角括弧("["と"]")が含まれていると、grepはそれを正常に処理するのが困難になります。まず、次の方法を使用して入力を「衛生処理」する必要があります。各角括弧は、一致するリテラル文字として解釈されるように、一対の角括弧で囲む必要があります。

CommandYouWantToPipeThroughGREP | sed -e 's^\([][]\)^\[\1\]^g' | grep ...

sed コマンドの説明:

sed -e: -e の後に式が続きます。一重引用符または二重引用符で囲む必要があります。

s^:[探す。 「^」はフィールド区切り文字として使用されます。 「^」が表示されるたびに、検索オプションの新しいセクションが区別されます。

\(...\)\1:sedで変数としてアクセスできるパターンを含めるには、角かっこをエスケープします。最初のパターンを「\1」、2番目のパターンを「\2」と呼びます。

[][]:2つの外側ブラケットが2つの内側ブラケットを囲みます。 「[」の後の最初の文字は自動的にリテラルと見なされます(エスケープ処理/特別な意味はありません)。最初の文字は角かっこなので、次の角かっこも「^」区切りフィールドの最後の前にある唯一の角かっこでない限り、リテラルと見なされます。 (少なくともそれがどのように機能するかについての私の理解は...)

\[\1\]: sed 変数 1("\1") を角括弧で囲み、出力に送信します。

g:[貪欲。これは、「最初のテキストだけでなく、検索テキストのすべてのインスタンスを見つけて置き換えること」を意味します。

したがって、このsedコマンドを使用して角かっこを含むことができる入力をパイプし、grepを介してパイプすると、grepは角かっこを特殊文字として解釈せずに文字通り検索します。残念ながら、最初のコマンドの後に別のgrepコマンドにパイプする場合は、角かっこをエスケープするにはsedを介して再実行する必要があるようです。

関連情報