2009-11-01 4 views
1

문자로 시작하는 단어와 0 문자 이상이 아닌 모든 특수 문자 (기본적으로 C++ 변수에 사용할 수있는 이름)가없는 모든 행을 필터링해야합니다.정규 표현식 Unix 쉘 스크립트

egrep '^[a-zA-Z][a-zA-Z0-9]*' 

이는 "AB10" "A"로 단어를 잘 작동하지만 그것은 또한 "b.b"와 같은 단어가 포함되어 있습니다. 나는 표현의 끝에 * 문제가 있다는 것을 이해한다. *를 + (하나 이상)로 바꾸면 한 글자 만 포함 된 단어는 건너 뜁니다. 따라서 도움이되지 않습니다.

편집 : 정확해야합니다. 위에서 설명한대로 여러 단어로 줄을 찾고 싶습니다. 그들은 모두 설명 된 조건에 맞는, 그리고 라인은 문자로 시작하지 않는 하나 개 이상의 단어를 포함로

int = 5; 
cout << "hello"; 
//some comments 

이 경우는 위의 모든 라인을 인쇄해야합니다 예를 들면 다음과 같습니다. 라인을 가정

+0

여기에서 문제는 ^는 줄의 시작을 의미하지만 단어가 들어있는 줄에는 관심이 있습니다. 나는 편집을 제안한다. – JXG

답변

5

솔루션은 대략 다음과 같습니다. 이 경우 regex는 "단어"앞에 공백이나 행의 시작이오고 그 다음에 공백이나 행의 끝이 오도록 요구합니다. 필요에 따라 경계 요구 사항 (괄호 안의 내용)을 수정해야합니다.

'(^|)[a-zA-Z][a-zA-Z0-9]*(|$)' 
+0

이것은 정확히 내가 찾고있는 것입니다. 많은 감사합니다 !!! – Mike55

1

단어 후에 종료 : 당신은 그것에 무언가를 추가해야

'^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$' 
+0

"OR"을 정규식과 함께 사용할 수 있는지 알지 못했습니다. 그게 훨씬 쉽습니다. 감사. – Mike55

0

. 나머지 부분은 공백이 될 수도 있고 줄 끝 부분을 추가 할 수도 있습니다. (AFAIR은 $입니다.)

0

귀하의 문제는 각각 라인의 시작과 끝을 일치 ^$ 앵커에있다. 당신은이 단어를 포함 않을 경우 행이 일치하려면, 앵커를 치우는 것은 당신이 원하는 것을 :

egrep '[a-zA-Z][a-zA-Z0-9]+' 

주 길이의 2 이상의 + 일치하는 단어도 문자를 signel 것 그 장소에서 * .