grep은 와일드카드 그룹화를 사용하여 일치하지 않고 전체 파일을 인쇄합니다.

grep은 와일드카드 그룹화를 사용하여 일치하지 않고 전체 파일을 인쇄합니다.

*grep을 사용하여 대괄호로 그룹화하고 또는 같은 와일드카드와 결합하면 ?전체 파일이 인쇄되지만 일치하는 항목은 강조 표시되지 않습니다.~해야 한다발견되었습니다.

test.txt:

find this
asdffind this
find this asdf
sadffind thisasdf
(find this)
(find this)?

grep -in "find this" test.txt:
이것을 찾았다
아스다프이것을 찾았다
이것을 찾았다시리아
방위군이것을 찾았다아스다프
(이것을 찾았다)
(이것을 찾았다)?

grep -in "\(find this\)" test.txt:
이것을 찾았다
아스다프이것을 찾았다
이것을 찾았다시리아
방위군이것을 찾았다아스다프
(이것을 찾았다)
(이것을 찾았다)?

grep -in "\(find this\)\?" test.txt:
이것을 찾았다
   이것을 찾았습니다 <-- 왜 find this일치하지 않나요?
asdfffind this <-- 왜 find this일치하지 않나요?
이것을 찾았다asdf
Sadffind thisasdf <-- 왜 일치하지 않나요 find this?
(찾아보세요) <--왜 find this일치하지 않나요?
(이것을 찾아보세요)? <-- 왜 find this일치하는 항목이 없나요?

?줄의 시작 부분부터 시작하는 구문 만 찾습니다. 이 캐릭터도 마찬가지다 *.

?와일드카드를 적용 하려고 합니다 .전체 문구. 괄호가 없으면 해당 단어가 포함된 마지막 단어에만 적용됩니다. 그렇죠?
grep "find this\?"Only works ?, this이는 내가 원하는 것이 아닙니다.

편집하다:

내 문제는 "문구"를 개별 단어로 취급하려고 하는데 작동하지 않는다는 것입니다.

답변1

귀하의 문제는 그룹화를 비활성화하기 위해 대괄호를 이스케이프 처리해야 한다고 생각하는 것입니다. 실제로 대괄호를 이스케이프 처리하면 그룹화가 가능해집니다. 예를 들어, 일치하는 줄만 인쇄하려면 다음을 (find this)실행하면 됩니다.

$ grep -in "(find this)" test.txt
5:(find this)
6:(find this)?

괄호( \( \))를 이스케이프 처리하면 및 가 일반 문자로 처리되지 grep않고 특수 "그룹" 구분 기호로 처리된다는 의미입니다. 예를 들어 다음을 수행할 수 있습니다.()

$ echo "foofoo" | grep -o '\(.oo\)\1'
foofoo

두 개의 Os( )가 뒤에 오는 모든 문자와 일치 .oo하지만 이스케이프 괄호 안에 있으므로 이제 일치하는 모든 문자를 로 인용할 수 있습니다 . \1foofoo일치시키 겠습니다.\(.oo\).*\1

에도 동일하게 적용됩니다 ?. 정규식 와일드카드(예: )를 따르지 않는 한 .이는 일반 문자입니다. 따라서 해당 행만 일치시키려면 (find this)?다음을 수행할 수 있습니다.

$ grep -in "(find this)?" test.txt
6:(find this)?

답변2

실제로 무엇을 하려는지 모르므로(귀하의 설명이 말이 안 됨), 귀하가 내린 명령이 무엇인지 설명하는 데에만 답변하겠습니다. 설명에서 언급했듯이 이전 버전의 grep에서 오류가 발생할 수 있습니다. 최신 버전(예: 최신 Linux 배포판 또는 Homebrew)을 사용해 보세요.

Grep은 지정된 패턴과 일치하는 행을 검색합니다. grep의 출력은 라인의 어느 부분이 일치하는지에 관계없이 전체 라인입니다. (이 옵션은 -o이를 변경합니다.) 예를 들어, grep a test.txt포함된 모든 행을 인쇄합니다 a. 그뿐만 아니라 전체 라인 a.

특히 패턴이 빈 문자열과 일치할 수 있으면 grep은 모든 줄을 인쇄합니다. 예를 들어, Since는 빈 문자열을 포함하거나 포함하는 모든 줄을 \?인쇄하는 0 또는 1 연산자입니다 . 모든 줄에 빈 문자열이 포함되어 있으므로 모든 줄이 인쇄됩니다.grep 'a\?' test.txta

마찬가지로 grep "\(find this\)\?"문자열을 포함하거나 빈 문자열을 포함하는 모든 줄을 인쇄하므로 모든 줄을 인쇄합니다. find this이 연산자는 \?그룹에 적용됩니다 find this(grep의 기본 정규식 구문에서 백슬래시 대괄호는 그룹을 구분합니다).

강조 표시는 행 일치 동작의 상단에 적용됩니다. 행을 일치시키는 방법이 여러 가지인 경우 문서(GNU grep 2.25 기준)에서 가능하면 null이 아닌 일치가 사용된다고 명시하지 않는 한 grep이 일치를 고려할 부분은 지정되지 않습니다. 내 생각에 GNU grep은 가장 긴 일치 항목을 사용하는 것 같습니다.

연산자는 "단어"에는 적용되지 않습니다. 이전에 적용됩니다.특징또는괄호 안의 그룹. 예를 들어, find this\?"둘 중 하나 find this"를 의미합니다 find thi. \?연산자는 마지막 연산자에만 적용됩니다 s. 또는 find을 일치시키려면 find thisgroup: 을 사용하십시오 find\( this\)\?.

관련 정보