grep“+”연산자가 작동하지 않습니다


31

ls -l /var/log | awk '{print $9}' | grep "^[a-z]*\.log."

이것을 출력합니다 :

alternatives.log.1
alternatives.log.10.gz
alternatives.log.2.gz
alternatives.log.3.gz
alternatives.log.4.gz
alternatives.log.5.gz
alternatives.log.6.gz
alternatives.log.7.gz
alternatives.log.8.gz
alternatives.log.9.gz
apport.log.1
apport.log.2.gz
apport.log.3.gz

하지만 이것은:

ls -l /var/log | awk '{print $9}' | grep "^[a-z]+\.log."

아무것도 출력하지 않습니다.

왜? 방금 변경 *했습니다 +. 비슷하지 않습니까? 연산자 +는 하나 이상의 일치와 *0 이상이 필요합니다.

답변:


36

이는 grep인수없이) 표준 정규식에서만 작동 하기 때문 입니다. +그래서를 사용하여, 당신은 사용해야하는 확장 된 정규 표현식의 일부 grep -E또는 egrep:

ls -l /var/log | awk '{print $9}' | grep -E "^[a-z]+\.log."

또한 확장 정규 표현식을 사용하지 않으려면이 작업을 수행 할 수 있습니다.

ls -l /var/log | awk '{print $9}' | grep "^[a-z][a-z]*\.log."

감사. 나는 이제 그 해결 방법에 대해 설명했지만 왜 "+"가 작동하지 않는지 궁금했습니다. 이제 알아 다시 감사합니다.
Marko

11

MiJyns 답변을 자세히 설명하기 위해 +와 같은 "특수 문자"는 표준 정규식에서도 작동하지만 백 슬래시로 이스케이프 처리해야합니다. 기본 기대치가 표준 정규 표현식과 확장 정규 표현식 사이에서 뒤바뀐다고 말할 수 있습니다.

표준 정규식에서 문자는 기본적으로 문자 그대로 일치합니다. 예를 들어 grep "ab+"+에서 리터럴은 +입니다. 정규식은 예를 들어 "ab + ab"를 찾지 만 "abbbb"는 찾지 않습니다. +의 "특별한 의미"를 사용하려면 이스케이프해야합니다. 따라서 grep "ab\+""abbb"는 찾을 수 있지만 "ab + ab"는 더 이상 찾을 수 없습니다. 마지막 예에서 +는 수량 자 "한 개 또는 여러 개"(이 경우 "하나 또는 많은 b")로 해석되기 때문입니다.

확장 정규 표현식에서는 정확히 다른 방법입니다. 여기서 문자 그대로 처리하려면 "특수 문자"를 이스케이프해야합니다. 따라서 grep -E "ab+""ab + ab"이 아닌 "abbb"를 찾습니다. +를 이스케이프하면 문자 그대로 일치합니다. 따라서 grep -E "ab\+""abbb"가 아닌 "ab + ab"를 찾습니다.


1
마법과 슈퍼 매직과 같은 레거시 혼란은 ... ;-) vim에 있습니다. 어. 이전 버전과의 호환성을 위해 지불하는 가격 ...
Rmano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.