왜 grep fil *가 실패합니까?


9

나는 echo file|grep fil*실패했지만 echo abcd|grep abc*성공했다.

이해할 수 없습니다. 누군가 설명 할 수 있습니까?


시스템 및 grep 버전을 추가 할 수 있습니까? 이것은 gnugrep 2.16 (Ubuntu 14.04 LTS)에서 오류 (종료 코드 0)를 생성하지 않으며 처음 세 글자와 일치하기 때문입니다. 예를 들어 e로 echo file|grep fil*대답 fil합니다.
Hastur

3
@Hastur이 문제는 정규 표현식 이전의 파일 이름 확장으로 인해 발생합니다. 내 작업 디렉토리에는 파일 접두사가 fil이지만 접두사가 abc가 아닌 파일이 포함되어 있으므로 fil *는 파일 이름으로 바뀌지 만 abc *는 변경되지 않습니다.
tmpbin

고마워, 난 그것에 대해 생각하지 않았다. 시도 할 때 새 디렉토리에서 시도합니다.
Hastur

답변:


31

귀하의 예에는 두 가지 문제가 있습니다.

기본 표현정규 표현식 이 "모든 문자 시퀀스"를 의미하는 와일드 카드라는 글로 패턴 과 동일하게 작동 한다고 가정한다는 것 *입니다. 정규 표현식에서 *대신 "이전 원자의 수"를 fil*의미 하므로 뒤에 0 개 이상의 문자 fi옵니다 l. grep fil.*의도 된 의미를 얻으려면 다음과 같이 말해야 합니다. ."단일 문자이므로 .*"모든 문자 시퀀스 " 를 의미합니다.

덜 문제는 따옴표 붙은 특수 문자를 사용하여 glob 규칙에 따라 의미가 있다는 것입니다. 즉, 쉘이 해석 할 수 있습니다. 당신이 글로브 패턴과 일치하는 로컬 디렉토리의 모든 파일이 있다면 fil*또는 abc*, 이를 확장 할 쉘은 , 그래서 grep패턴이 아닌 의도 된 RE으로 확장 된 파일 이름을 얻을 것입니다. 명령 행에서 이러한 문자를 사용할 때마다 다음을 인용해야합니다 echo file | grep 'fil.*'..

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