이 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"라고 합니다.

[][]: 두 개의 외부 브래킷이 두 개의 내부 브래킷을 둘러쌉니다. "[" 뒤의 첫 번째 문자는 자동으로 리터럴로 간주됩니다(이스케이프 처리/특별한 의미 없음). 첫 번째 문자는 대괄호이므로 다음 대괄호도 "^" 구분 필드 끝 앞에 있는 유일한 대괄호가 아닌 한 리터럴로 간주됩니다. (적어도 그것이 어떻게 작동하는지에 대한 나의 이해는 ...)

\[\1\]: sed 변수 1("\1")을 대괄호로 묶어 출력으로 보냅니다.

g: [탐욕스러운. 이는 "첫 번째 텍스트뿐 아니라 검색 텍스트의 모든 인스턴스를 찾아서 바꾸는 것"을 의미합니다.

따라서 이 sed 명령을 통해 대괄호를 포함할 수 있는 입력을 파이프한 다음 grep을 통해 파이프하면 grep은 대괄호를 특수 문자로 해석하지 않고 문자 그대로 찾습니다. 불행하게도 첫 번째 명령 이후에 다른 grep 명령으로 파이프하는 경우 대괄호를 다시 이스케이프하려면 sed를 통해 다시 실행해야 하는 것 같습니다.

관련 정보