이 grep의 문제점은 무엇입니까?


1
> 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
당신은 무엇을 달성하려고합니까? 파일에서 $line변수가 무엇을 참조 합니까? grep확장 된 grep을 사용하지 않는 한 기본적으로 대괄호를 이스케이프해야합니다.
Jakuje

나는 모든 명령을 내렸다. 나는 BackboneJS 코드베이스를 통해 grepping 부모 클래스를 찾을 수있는 문구 "* .extends"를 찾고 있어요
itsmichaelwang

괄호는 범위 선택을위한 것입니다
itsmichaelwang 08:12

2
나는 -f당신이 생각하는 것을하지 않는다고 생각합니다. 파일에서 검색 할 패턴을 읽고 해당 파일을 grep하지 않습니다.
drewbenn

@drewbenn이 맞습니다. -f잘못 사용하고 있습니다. 그리고 코드에서 여전히 달성하고자하는 것이 그리 명확하지 않습니다.
Jakuje

답변:


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"

(그리고 FWIW, 나는 find완전히 제거하고 , 켜고 shopt -s globstar루프를 돌릴 for line in **/*.js것이지만, 그것은 내 개인 코드 가독성 선호이며 반드시 더 빠르거나 더 나은 것은 아닙니다).
drewbenn

그래서 실제로 아무것도 얻지 못했습니다 ... 파일의 내용을 검색하고 싶습니다. $ line은 내가 믿는 파일 이름입니다. 그렇게 할 방법이 있습니까?
itsmichaelwang

실제로 나는 분명히해야합니다. 이 줄을 찾고 싶습니다 : return BaseView.extend({모든 정규식이 일치해야한다고 말하고 있지만 grep은 아무것도 반환하지 않습니다.
itsmichaelwang

grep -E확장 정규 표현식 을 원하기 때문에 @ Zapurdead .
drewbenn

0

grep 파이프로 들어오는 입력에 대괄호 ( '['및 ']')가 포함되어 있으면 grep이 정상적으로 처리하는 데 어려움이 있습니다. 먼저 다음과 같은 방법으로 각 대괄호를 대괄호 쌍으로 묶어 입력을 "위생 화"해야합니다. 따라서 문자가 일치하는 문자로 해석됩니다.

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

sed 명령에 대한 설명 :

sed -e: 표현식은 -e 뒤에옵니다. 작은 따옴표 나 큰 따옴표로 묶어야합니다.

s^:에 대한. "^"은 (는) 필드 구분 기호로 사용됩니다. "^"가 표시 될 때마다 검색 옵션의 새로운 부분이 구분됩니다.

\(... \)\1: 이스케이프 처리 된 괄호는 sed에서 변수로 액세스 할 수있는 패턴을 포함합니다. 이러한 첫 번째 패턴은 "\ 1"이라고합니다. 두 번째는 "\ 2"입니다.

[][]: 외부 2 개의 브래킷이 내부 2를 둘러싸고 있습니다. "["뒤의 첫 문자는 자동으로 리터럴 인 것으로 간주됩니다 (특별한 의미가 없음). 첫 번째 문자는 대괄호이므로 "^"구분 필드의 끝 이전에 유일한 대괄호가 아니라면 다음 대괄호도 리터럴로 간주됩니다. (적어도 그것이 작동 방식에 대한 나의 이해입니다 ...)

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

g: [g] 건방진. "검색 텍스트의 첫 번째 예가 아닌 모든 예를 찾아서 바꾸십시오"를 의미합니다.

따라서 grep을 통해 파이프하기 전에이 sed 명령을 통해 대괄호를 포함 할 수있는 입력을 파이프하면 grep은 대괄호를 특수 문자로 해석하는 대신 문자 그대로 찾습니다. 불행히도, 다른 grep 명령으로 파이프하면 첫 번째 명령 후에 sed를 통해 다시 실행하여 브래킷을 다시 탈출해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.