> 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
$
-f
GNU 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を介して再実行する必要があるようです。