Bash

這個 grep 有什麼問題?

  • November 2, 2015
> 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

我在網上看到的所有例子似乎都表明這裡沒有錯,所以我很困惑

方括號肯定是平衡的,不是嗎?

你的問題是-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"
  • 您正在使用擴展正則表達式,因此請使用egrepgrep -E
  • --將阻止grep解析$line變數中的任何選項,例如,它將保護您免受名為“ -r funnyname.js”的文件的侵害

引用自:https://unix.stackexchange.com/questions/222850