2014-11-11 2 views

답변

0

ls | grep *e*ls | grep e은 같은 명령이 아닙니까?

아니요, 이들은 다릅니다.

$ ls | grep *e* 

명령 셸는 현재 디렉토리에서 문자 e를 포함하는 모든 파일과 일치하는 패턴 *e*을 확장합니다. 이 확장 된 파일 목록은 다음 grep 명령에 전달됩니다

$ ls 
Hello.txt Null.txt Sample.txt 

실행

$ ls | grep *e* 

실제 명령 파일이 없습니다

$ ls | grep e 

으로 ls | grep Hello.txt Sample.txt

될 것입니다 이름 확장 및 실제 명령은이됩니다..

다음
$ ls | grep "*e*" 

, 명령이 실제로있을 것입니다 :

는 확장하지 않고 매개 변수를 전달하려면

, 당신은 그것을 인용 할 필요도 참조 ls | grep *e* ("*e*"argv[1]으로 grep 명령에 전달됨).

셸 확장은 정규 표현식과 다릅니다. 셸은 *의 모든 문자열과 일치하며, 정규 표현식에서는 *은 이전 표현식의 개수가 발생해야 함을 나타냅니다.

0

셸은 명령을 실행하기 전에 *e*을 확장합니다. 따라서 파일 이름이 beer이고 free 인 경우 beer에 대한 그렙을 free에 입력하고 ls에서 입력을 무시합니다.

*e*은 유효한 정규 표현식이 아닙니다. *은 "0 이상의 선행 표현식"을 의미하며 첫 번째 인스턴스에는 선행 표현식이 없습니다. 올바르게 grep에 오류가 표시되어야하지만 그렇지 않습니다. 아무 것도 반복하지 않고 0 번 이상 반복하고이어서 e을 0 번 이상 반복합니다. 상상할 수있는 모든 입력에는 0이 상 또는 그 이상이 포함되기 때문에 모든 입력 라인과 일치하게됩니다.

그러나 위에서 설명한 것처럼 grep은 쉘에 의해 가로 채어 확장되기 때문에이 입력을 볼 수 없습니다. 문자 그대로 *을 사용하려면 인용 부호가 필요합니다. 선행 및 후행 와일드 카드 값을 추가하지 않기 때문에

ls | grep '.*e.*' 

ls | grep 'e' 

말을 그냥 정말 절름발이 방법입니다 - grep 항상 어디서나 각 입력 라인에 일치를 찾습니다. *e* 정규 표현식하지

ls *e* 

글로브 표현하지만, 글로브 패턴 : 당신이 실제로 원하는 것은

쉘의 기능과 일치하는 와일드 카드를 사용하는 것입니다. 당신이 분명히 기대하는대로합니다.

관련 문제