2010-12-18 7 views
0

인사말.반복이있는 간단한 정규 표현식은 나를 곤란하게한다.

단순한 문제로 인해 저를 곤란하게했습니다. 여기 사람들은 매우 도움이됩니다.

일부 고정 텍스트와 임의 숫자가 포함 된 문자열을 찾으려고합니다.

echo blah blah abc123 | grep -o abc 
abc 

echo blah blah abc123 | grep -o abc[0-9] 
abc1 

echo blah blah abc123 | grep -o abc[0-9]+ 

echo blah blah abc123 | grep -o "abc[0-9]+" 

echo blah blah abc123 | grep -o "abc[0-9]*" 
abc123 

echo blah blah abc123 | grep -o abc[0-9]{3} 

echo blah blah abc123 | grep -o "abc[0-9]{3}" 

* 연산자 (0 번 이상 일치)가 예상 한대로 작동하는 유일한 연산자입니다.

왜 + 연산자 (1 회 이상 일치)가 일치하지 않습니까?

특정 반복 횟수 연산자 {3}이 (가) 일치하지 않는 이유는 무엇입니까?

나는 차이를 만드는 경우 우분투 10.10 아래의 bash 셸에서 이러한 예제를 실행하고 있습니다.

고마워요.

답변

6

는 특수 문자를 이스케이프 그들은 ​​모두 일 :

$ echo blah blah abc123 | grep -o "abc[0-9]\+" 
abc123 
$ echo blah blah abc123 | grep -o "abc[0-9]\{3\}" 
abc123 

이스케이프 당신은 아마 추론대로, 정규식은 리터럴 + 또는 {를 찾고 있습니다.

정확히 왜 *은 이스케이프 처리하지 않아도되지만 +을 탈출해야하는지에 대해서는 확실하지 않습니다.

+3

이제 grep 맨 페이지의 의미를 이해합니다. "기본 정규 표현식에서?, +, {, |, (,))는 특별한 의미를 잃지 만 백 슬래시 버전은 \ ?, \ +, \ {, \ |, \\ (및 \\) " – OddZon

+1

BTW, 정말 stackoverflow 싶습니다. – OddZon

+2

문제는, 기본적으로'grep'은이 제한된 버전의 regexen을 사용한다는 것입니다. 'egrep' 또는'grep -E'를 사용하여 원하는 정규식 구문을 얻으십시오. –