Development Tip

grep에서 별표 기호 사용

yourdevel 2020. 10. 23. 19:12
반응형

grep에서 별표 기호 사용


Linux / bash의 특정 파일에서 "abc"하위 문자열을 검색하려고합니다.

그래서 나는 :

grep '*abc*' myFile

아무것도 반환하지 않습니다.

하지만 내가 할 경우 :

grep 'abc' myFile

일치를 올바르게 반환합니다.

자, 이것은 나에게 문제가 아닙니다. 하지만 더 복잡한 문자열을 grep하려면 어떻게해야합니까?

*abc * def *

grep을 사용하여 어떻게 수행합니까?


별표는 반복 연산자 일 뿐이지 만 반복하는 내용을 알려야합니다. /*abc*/ab와 0 개 이상의 c를 포함하는 문자열과 일치합니다 (두 번째 *는 c에 있기 때문입니다. 첫 번째는 반복 할 것이 없기 때문에 의미가 없습니다). 무엇이든 일치 .*시키려면 점은 모든 문자를 의미합니다 ( 특정 지침 내에서 ). abc 만 일치 시키려면라고 말할 수 있습니다 grep 'abc' myFile. 더 복잡한 일치를 위해서는 .*- 를 사용 grep 'abc.*def' myFile하여 abc 다음에 def가 포함 된 문자열을 선택적으로 그 사이에있는 항목과 일치 시켜야합니다 .

댓글에 따라 업데이트 :

*정규식에서 콘솔의 *와 정확히 동일하지 않습니다. 콘솔에서 *는 glob 구조의 일부이며 와일드 카드 역할 만합니다 (예를 들어 ls *.log.log로 끝나는 모든 파일을 나열합니다). 그러나 정규식에서 *는 수정 자이며, 이는 앞에 오는 문자 또는 그룹에만 적용됨을 의미합니다. 정규식에서 *를 와일드 카드로 사용하려면 .*이전에 언급 한대로 사용해야 합니다. 점은 와일드 카드 문자이고, 점을 수정할 때 별표는 하나 이상의 점을 찾는 것을 의미합니다. 즉. 하나 이상의 문자를 찾습니다.


점 문자는 모든 문자와 일치 함을 의미하므로 모든 문자가 .*0 개 이상 발생 함을 의미합니다. 당신은 아마 사용하는 의미 .*만이 아니라 *.


"별표"는 앞에 무언가가있을 때만 의미가 있습니다. 도구가 없으면 (이 경우 grep) 오류로 처리 할 수 ​​있습니다. 예를 들면 :

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz

예를 들어 Linux의 셸 명령 줄에서 작동하는 식과 같이 시도한 식을 " glob " 이라고합니다 . Glob 표현식은 grep이 찾을 문자열을 지정하는 데 사용하는 완전한 정규 표현식이 아닙니다 . 여기에 차이점에 대한 (오래된 작은) 포스트입니다. glob 표현식 ( "ls *"에서와 같이)은 쉘 자체에서 해석됩니다.

glob에서 RE로 변환하는 것이 가능하지만 일반적으로 머리 속에서 그렇게해야합니다.


grep -P를 사용하여 Perl 스타일 정규식을 지원합니다.

grep -P "abc.*def" myfile

정규 표현식을 사용하지 않으므로 선택한 grep 변형은이어야하며 fgrep예상대로 작동합니다.


확장 정규식 지원을 위해 grep -E 시도

또한 다음을 살펴보십시오.

grep 매뉴얼 페이지


이것은 당신이 찾고있는 대답 일 수 있습니다 :

grep abc MyFile | grep def

유일한 것은 ... 출력 라인이 "def"가 "abc"앞 또는 뒤에 있다는 것입니다.


'*'는 이전 항목의 수정 자로 작동합니다. 따라서 'abc * def'는 'ab'와 0 개 이상의 'c'뒤에 'def'를 검색합니다.

아마도 원하는 것은 'abc. * def'로 'abc'와 그 뒤에 'def'가 붙은 문자 수를 검색합니다.


이것은 나를 위해 일했습니다.

grep ". * $ {expr}"-점이 앞에 오는 큰 따옴표 포함, 추가 스위치가없는 표준 grep.

참고 URL : https://stackoverflow.com/questions/1069302/using-the-star-sign-in-grep

반응형