2013-01-08 1 views
-1

나는 grep atm을 배우고 있지만 나는 클라인 스타 메타 문자의 작동을 이해하는 데 어려움을 겪고있다. 설명서 페이지는 *이 이전 문자와 0 번 이상 일치한다고 설명합니다. 나는 a의 0 개 이상의 발생과 일치해야합니다 다음과 같은 내용grep : 클론 스타 (*)는 언제 그 자체와 일치해야합니까?

*a 
123ab 
1234 
abcdef 
a? 
? 

grep 'a*' test와라는 이름의 파일 test를 사용하고 등은 인쇄 출력의 test 파일의 모든 라인을 설명했다. *과 같은 메타 문자와 일치 시키려면 백 슬래시 \ 앞에 붙여서 이스케이프 처리해야한다고 설명합니다. 그러나 grep '*' testgrep '\*' test의 출력은 같습니다. 출력 : *a* 앞에 붙지 않고 \과 일치합니까?

+3

'* a '는 유효한 grep 패턴이 아닙니다 (유효하지 않은 정규 표현식이므로). grep은 아마도 "정의되지 않은 동작"을 어떻게 처리 할 것인가? 그리고 구현은 그들이 원하는 것을 할 수있다. (축 어적으로는 초기'* '를 처리하는 것) –

+0

그러나 grep은 \ test를 완벽하게 일치시킨다. . –

+0

'\ * a'는 유효한 정규 표현식이므로 –

답변

3

*은 반복 할 이전 항목이 없으므로 잘못된 정규 표현식입니다. 이 경우 grep을 구현하면 리터럴 *으로 해석됩니다. \**과 일치하는 유효한 정규 표현식입니다. 구현의 잘못된 정규 표현식 *과 올바른 정규 표현식 \*의 해석이 동일하게 발생합니다.

*\*의 차이점을 실제로 보려면 그 전에 항목을 추가하여 유효한 정규 표현식으로 시도해야합니다. 예를 들어, a 리터럴 : *이 성공적으로 영 문자와 일치 할 수 있기 때문에

grep 'a*' 
grep 'a\*' 

전자는 아무것도 일치합니다. 후자는 말 그대로 a*을 포함하는 행만 일치시킵니다.

+2

잘못 되었나요? 어떤 표준에 따르면, 정확하게? :-) – paxdiablo

+1

@ paxdiablo : 일반적인 정규 표현 엔진이하는 일과 거의 일치하는 일이 일어나는 내 머리 속의 하나. – icktoofay

3

정규 표현식의 선두 *section 9.3.3 of SUSv3에 따라 유효합니다. Naruto, 플랫폼의 정규 표현 인터프리터는 여기에서 올바른 일을합니다. *은 정규 표현식의 시작 부분에있을 때 특수 문자가 아닙니다.