2012-05-10 5 views
9

알아낼 수없는 grep과 관련된 문제가 있습니다. 원본 파일 집합에서 큰 따옴표 (C 문자열)로 묶인 소문자 단어의 모든 인스턴스를 검색하려고합니다.큰 따옴표로 묶인 그립 패턴 일치 소문자 문자열

grep -e '"[a-z]*"' *.cpp 

나를 그냥 소문자 아니다 "ABC"와 같은 일치 제공하는 동안,

grep -e '"[a-z]+"' *.cpp 

나에게 더 일치를 제공하지 : 배쉬와 GNU 그렙 사용. "abc"와 일치하는 올바른 정규 표현식은 무엇입니까?

+0

두 번째 정규식이 정상적으로 보입니다. 나는 그것을 시도하고 그것은 대문자와 일치하지 않습니다. – Misha

+1

@ 로케일 특정 조합 순서를 잊어 버리는 것과 같습니다. –

+0

@Don 감사합니다. 그것에 대해 생각조차하지 않았습니다! – Misha

답변

8

:

LC_ALL=C egrep '"[a-z]+"' *.cpp 
+0

그래, 어리석은 로케일. 또한 +를 왜 이스케이프해야합니까? 나는 만약 내가 문자 그대로를 원한다면 나는 그것을 벗어날 것이고 맨손으로 +는 메타 문자로 간주 될 것이라고 생각할 것이다. –

+1

기본 정규 표현식에서?, +, {, |, (, 및) 메타 문자는 특별한 의미를 잃습니다. 대신 백 슬래시 버전 \?, \ +, \ {, \ |, \ (및 \)을 사용하십시오. 연장 정규식을 얻으려면 -E –

+0

-E를 사용하십시오. 감사합니다. 늙은 습관이 많이 죽는다. –

1

이 마스크 +

grep -e '"[a-z]\+"' *.cpp 

또는 egrep을 사용

egrep '"[a-z]+"' *.cpp 

어쩌면 당신이 마음에 -E했다 :

grep -E '"[a-z]+"' *.cpp 

소문자 -e를 사용하는 예를 들어, 여러 검색 패턴을 지정합니다.

로케일에서 기원은 수 대문자의 phaenomenon - 당신이 방지 할 수 있습니다 : 당신은 탈출을 잊고있는

grep -e '"[a-z]\+"' *.cpp 
+0

나는 grep -e가 egrep이라고 생각했다. 나는 실수했다고 생각한다. –

+0

그래, 나도 그렇게 생각했다.하지만 내 습관이 egrep을 사용하기 때문에, egrep을 -e 옵션에 가깝게 보지 않고 테스트했고 egrep을 성공한 직후에 -e가 비슷한 것을해야한다는 것을 깨달았다. 같은 생각. 하지만 정확한 옵션은 -E이며 대문자 E입니다. 맨 페이지에서 스스로 찾으십시오. –

0

당신은 아마 +을 탈출해야합니다 메타 문자.

grep -e '"[a-z]\+"' 

두 번째 부분에서는 로켈 때문에 멀티 문자와 일치하는 이유가 있습니다. 다음과 같이

$ echo '"Abc"' | grep -e '"[a-z]\+"' 
"Abc" 
$ export LC_ALL=C 
$ echo '"Abc"' | grep -e '"[a-z]\+"' 
$ 

는 "아스키 같은"행동을 얻으려면, 당신이 당신의 로케일을 설정해야하는 "C",은 grep 남자 페이지에 지정된 : 브라켓 표현식 내에서

, 범위 식은 하이픈으로 구분 된 두 개의 문자로 구성됩니다. 로케일의 조합 순서와 문자 세트를 사용하여 두 문자 사이를 정렬하는 단일 문자 과 일치합니다. 예를 들어 기본 C 로켈의 [a-d]는 [abcd]와 같습니다. 대부분의 로케일은 사전 순서로 문자를 정렬하며 이러한 로케일 [a - d]는 일반적으로 [abcd]와 같지 않은 입니다. 예를 들어, [aBbCcDd]와 같을 수 있습니다. 당신이 로케일에 대해 혼란을 원하지 않는 경우 브래킷 식의 전통적인 해석을 얻으려면, 당신이 나를 위해 일한, 값 C.

0

에 LC_ALL 환경 변수를 설정하여 C 로켈을 사용할 수 있습니다 :

grep -e '"[[:lower:]]\+"' 
관련 문제