Linux / bash의 특정 파일에서 "abc"하위 문자열을 검색하려고합니다.
그래서 나는 :
grep '*abc*' myFile
아무것도 반환하지 않습니다.
하지만 내가 할 경우 :
grep 'abc' myFile
일치를 올바르게 반환합니다.
자, 이것은 나에게 문제가 아닙니다. 하지만 더 복잡한 문자열을 grep하려면 어떻게해야합니까?
*abc * def *
grep을 사용하여 어떻게 수행합니까?
Linux / bash의 특정 파일에서 "abc"하위 문자열을 검색하려고합니다.
그래서 나는 :
grep '*abc*' myFile
아무것도 반환하지 않습니다.
하지만 내가 할 경우 :
grep 'abc' myFile
일치를 올바르게 반환합니다.
자, 이것은 나에게 문제가 아닙니다. 하지만 더 복잡한 문자열을 grep하려면 어떻게해야합니까?
*abc * def *
grep을 사용하여 어떻게 수행합니까?
*
grep과 egrep에서 동일한 것을 의미합니다. 이것은 0 개 이상의 선행 원자를 의미 하는 수량 자 입니다. 이것은 쉘에서 사용 하는 와일드 카드 와는 완전히 다른 개념 입니다.
답변:
별표는 반복 연산자 일 뿐이지 만 반복하는 내용을 알려야합니다. /*abc*/
ab와 0 개 이상의 c를 포함하는 문자열과 일치합니다 (두 번째 *는 c에 있기 때문에 첫 번째는 반복 할 것이 없기 때문에 의미가 없습니다). 무엇이든 일치 .*
시키려면 점은 모든 문자를 의미합니다 ( 특정 지침 내에서 ). abc 만 일치 시키려면라고 말할 수 있습니다 grep 'abc' myFile
. 더 복잡한 경기를 위해서는 다음을 사용해야합니다 .*
.grep 'abc.*def' myFile
하여 abc 다음에 def가 포함 된 문자열을 선택적으로 그 사이에있는 항목과 일치 .
댓글에 따라 업데이트 :
*
정규식에서 콘솔의 *와 정확히 동일하지 않습니다. 콘솔에서 *는 glob 구조의 일부이며 와일드 카드 역할을합니다 (예를 들어 ls *.log
.log로 끝나는 모든 파일을 나열합니다). 그러나 정규식에서 *는 수정 자이며, 이는 앞에 오는 문자 또는 그룹에만 적용됨을 의미합니다. 정규식에서 *를 와일드 카드로 사용하려면 .*
앞서 언급 한대로 사용해야 합니다. 점은 와일드 카드 문자이고 점을 수정할 때 별표는 하나 이상의 점을 찾는 것을 의미합니다. 즉. 하나 이상의 문자를 찾습니다.
*
은 "0 개 이상"을 의미하며 grep은 기본적으로 탐욕 스럽습니다. 그렙에 있습니다 기본적인 정규 표현식 메타 문자는 ?
, +
, {
, |
, (
, 그리고 )
그들의 특별한 의미를 잃게됩니다. 추가 정보 : grep regexps
점 문자는 모든 문자와 일치 함을 의미하므로 모든 문자가 .*
0 개 이상 발생 함을 의미합니다. 당신은 아마 사용하는 의미 .*
만이 아니라 *
.
"별표"는 앞에 무언가가있을 때만 의미가 있습니다. 도구가 없으면 (이 경우 grep) 오류로 처리 할 수 있습니다. 예를 들면 :
'*xyz' is meaningless
'a*xyz' means zero or more occurrences of 'a' followed by xyz
grep -P 사용-Perl 스타일 정규식을 지원합니다.
grep -P "abc.*def" myfile
이것은 나를 위해 일했습니다.
grep ". * $ {expr}"-점이 앞에 오는 큰 따옴표 포함. 여기서 "expr"은 줄 끝에 필요한 문자열입니다.
추가 스위치가없는 표준 유닉스 grep.
'*'는 이전 항목의 수정 자로 작동합니다. 따라서 'abc * def'는 'ab'다음에 0 개 이상의 'c'를 'def'로 검색합니다.
아마도 원하는 것은 'abc. * def'로 'abc'와 그 뒤에 'def'가 나오는 문자를 검색합니다.