2012-01-10 6 views
4

나는 다음과 같은 정규식 그렙 실행하려고 해요! ""...어떻게 정규 표현식을 bash에서 제대로 탈출 할 수 있습니까?</p> <pre><code>(?<!key:)(?<!orKey:)(?<!isEqualToString:)@"[A-Za-z0-9]*" </code></pre> <p>첫 번째 시도 :

$ grep -r -n -H -E (?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\" ./ 
    -bash: !key: event not found 

확인을, 그래서의 탈출 할 필요가

$ grep -r -n -H -E (?<\!key:)(?<\!orKey:)(?<\!isEqualToString:)\@\"[A-Za-z0-9]*\" ./ 
    -bash: syntax error near unexpected token `(' 

좋아, 그래서 내가합니다 ... "("의 탈출을 필요

$ grep -r -n -H -E \(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\" ./ 
    -bash: !key:)(?: No such file or directory 

좋아, 그럼 문자열을 인용해야합니까?

$ grep -r -n -H -E '\(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\"' ./ 

반환 결과가 없습니다 ...하지만 나는 음의 모양 숨김 주장이없는 간단한 정규식을 시도하고, 그것은 ... 나는이 정규식과 TextWrangler 잘 사용 실행하고이 작업을 수행 그래서 여기서 명령 줄에서 뭔가 잘못하고 있다고 가정 할 수 있습니다.

편집

: 나는 -p 옵션을 사용하는 경우

가 :

$ grep -r -n -H -E -P '\(?<\!key:\)\(?<\!orKey:\)\(?<\!isEqualToString:\)\@\"[A-Za-z0-9]*\"' ./ 
grep: conflicting matchers specified 

이 파일 내용의 예는 일치해야한다 :

NSString * foo = @"bar"; 

파일 내용의 예를하는 안 경기 :

return [someDictonary objectForKey:@"foo"]; 
+0

일반적으로 '...'로 인용하는 것이 탈출하는 것보다 훨씬 바람직합니다. 이스케이프 처리하면 정규 표현식이 잘 리거나 덜 직관적이게됩니다. – smci

답변

5

핵심에는 ''으로 전체 문자열을 인용해야합니다. (""으로 묶으면 !은 슬픔을 줄 것입니다.) 그렇다면 정규식 (있는 경우) 내의 ' 내부 만 이스케이프해야합니다.

또한 -E (egrep) 정규식 대신 -P (perl)이 필요합니다.

grep -r -n -H -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' ./ 
+0

우수. 고맙습니다. 그게 효과가있어! 그래서, 내가 정규식을 하나의 틱으로 둘러싸면 나는! s를 벗어날 필요가 없다? – Steve

+0

예. 그렇지 않으면'''또는 전혀 인용되지 않은 경우 '!'는 bash에서 특별한 의미를 갖습니다. –

+0

고마워요. 지금은 아주 분명합니다. – Steve

4

정규식을 perl 정규식으로 해석하는 -P 옵션을 사용해보십시오. 또한 몇 가지 예제 입력과 출력을 제공하면 대답을 얻는 데 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 나의 질문을 편집했다. 내가 말했듯이, 정규 표현식 자체는 TextWrangler (내부적으로 grep을 사용함)를 통해 훌륭하게 작동합니다. 그래서 이것은 bash 인용 문제입니다. – Steve

+0

@ 스티브, TextWranger가 내부적으로'grep -P '를 사용하는 것은 가능합니다. (지금 당장 점검하고있는 ...) –

+0

2 개의 대답을 받아 들일 수 없어, 최선책은 +1입니다. 도와 주셔서 감사합니다. – Steve

2

' 완벽 한 표현식에는 '이 없습니다로 작품을 인용. 그리고 당신에게는 아무 것도 없기 때문에 괜찮을 것입니다.

정말로 인용문을 편집하는 경우 표현식을 파일에 넣고 대신 grep -f FILENAME을 사용하여 파일에서 정규식을 읽습니다.

그러나 실제로 펄 정규 표현식 지원을 요청하려면 grep -P을 지정해야 할 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다! – Steve

0

잘 작동하며 충돌 옵션을 사용하지 마십시오. -

[jaypal:~/Temp] cat filename 
NSString * foo = @"bar"; 
return [someDictonary objectForKey:@"foo"]; 

[jaypal:~/Temp] grep -P '(?<!key:)(?<!orKey:)(?<!isEqualToString:)\@\"[A-Za-z0-9]*\"' filename 
NSString * foo = @"bar";