![이 grep에 문제가 있나요?](https://linux55.com/image/70873/%EC%9D%B4%20grep%EC%97%90%20%EB%AC%B8%EC%A0%9C%EA%B0%80%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
> 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"라고 합니다.
[][]
: 두 개의 외부 브래킷이 두 개의 내부 브래킷을 둘러쌉니다. "[" 뒤의 첫 번째 문자는 자동으로 리터럴로 간주됩니다(이스케이프 처리/특별한 의미 없음). 첫 번째 문자는 대괄호이므로 다음 대괄호도 "^" 구분 필드 끝 앞에 있는 유일한 대괄호가 아닌 한 리터럴로 간주됩니다. (적어도 그것이 어떻게 작동하는지에 대한 나의 이해는 ...)
\[\1\]
: sed 변수 1("\1")을 대괄호로 묶어 출력으로 보냅니다.
g
: [탐욕스러운. 이는 "첫 번째 텍스트뿐 아니라 검색 텍스트의 모든 인스턴스를 찾아서 바꾸는 것"을 의미합니다.
따라서 이 sed 명령을 통해 대괄호를 포함할 수 있는 입력을 파이프한 다음 grep을 통해 파이프하면 grep은 대괄호를 특수 문자로 해석하지 않고 문자 그대로 찾습니다. 불행하게도 첫 번째 명령 이후에 다른 grep 명령으로 파이프하는 경우 대괄호를 다시 이스케이프하려면 sed를 통해 다시 실행해야 하는 것 같습니다.