2013-05-16 2 views
3

나는 여기서 뭔가 골치 덩어리를하고있는 것을 알지만, Unix/Linux 클래스에서 우리에게 주어진 정규식 치트 시트는 (내 독서로) 이것은 년을 포함하는 텍스트 파일의 줄을 찾아야한다는 것을 의미한다. (0000에서 9999 사이의 숫자) :어떤 년든지를위한 간단한 grep

grep \d{4} file.txt 

왜 아무것도 찾을 수 없습니까? 이것은 Windows에서의 PuTTY와 Mac의 Terminal에서의 결과와 동일한 bash를 사용합니다. 괄호와 따옴표를 사용하여 변형을 시도했지만 효과가 없습니다. [0-9][0-9][0-9][0-9]을 검색하면 작동하지만, 예상 한대로 \d 또는 {4}이없는 것 같습니다. 관련 메모에

, 왜 .\+는 동안 .+ "작동하지 않습니다"그냥 일반 내가 .+ 가지고있는 기대 효과를 가지고 있습니까? (나는 그 grep에게 뭔가를 찾으라고 말합니다. 그러나 저는 이것을 모릅니다.) 즉, "하나 이상의 문자"를 요구하는 방식 인 것처럼 보입니다. "한 문자 뒤에는 더하기 기호 ". (그것은 과제를 수행하는 올바른 방법이었고 교사는 왜 그런 식으로 설명 할 수 있었습니까?) 그리고 "한 문자 뒤에 더하기 기호"를 어떻게 검색합니까?

답변

3

당신의 치트 - 용지는 \d{4}이 "네 자리"를 의미하는 유효한 정규식이라고 말할 수 있습니다. grep이 파일에서 정규식을 검색한다고 말할 수 있습니다. 따로 따로 생각해 보면,이 두 문장 모두 사실입니다. 그러나 grep PATTERN FILE은 한 종류의 정규 표현식 (POSIX "Basic Regular Expressions", BREs)을 기대하고 있기 때문에 매우 오도 된 것입니다. \d{4}은 다른 종류의 정규 표현식 ("Perl Compatible Regular Expressions ", PCREs, Perl 프로그래밍 언어 사용).

많은 버전의 grep은 패턴이 BRE가 아닌 PCRE임을 나타 내기 위해 -P 플래그를 지원합니다. 그렇지 않으면 배쉬는 'd'에 대한 속기의 일종으로 \d을하기 때문에, 이러한 필요

grep -P '\d{4}' file.txt 

(\d{4} 주위에 작은 따옴표를 참고, 그래서 grep에 전달 된 실제 패턴은 d{4} 의미가 될 것입니다. 당신이 시도 할 수 있습니다 .. "네 d의"대신 "네 자리 숫자"의 양자 택일로, 당신은 다른 방법으로 같은 문제를 해결 grep -P \\d{4} file.txt을 쓸 수는)


편집 추가 할 : 죄송합니다. 질문 중 두 번째 부분 인 +에 대해 설명하지 않았습니다. 따라서, 관련 사양, 1이에 따라 :

grep .+ file.txt 

는 "NUL 이외의 모든 문자"를 의미하는 .를 사용하고 +는 "실제 더하기 기호"를 의미하는. 따라서 실제로는 처음이 아닌 더하기 기호가 포함 된 file.txt의 줄을 인쇄해야합니다. 당신이 다른 행동을 보게된다면, 당신의 쉘 그리고/또는 grep은 부적합해야합니다.

또한,이 (예 배시 등)에 부합 POSIX 쉘 +를 작성하는 화장 방법으로서 \+ 취급하므로

grep .\+ file.txt 

는 상기와 동일하므로 grep 동일한 인수를 볼 이전과. (grep.+보다는 .\+를 입력했는지 알 방법이 없습니다.)

마지막으로,이 :

합니다 ( \ 실제로 grep에 통과)
grep '.\+' file.txt 

이 보증되지 동작을하십시오 grep 제공 구현은 .+과 같은 의미로 사용하거나 \+을 "하나 이상"(또는 다른 것)을 의미하는 특수 표기로 사용하거나 오류 메시지를 표시 할 수 있습니다. GNU 구현은 "하나 이상의"해석을 취하지 만, 다른 것은 다를 수 있습니다.

각주 : 즉 the grep spec

  1. the BRE and ERE spec합니다 (grep 사양 링크를 말한다). 쉘이 grep으로 전달되는 실제 인수를 결정하기 때문에 관련도 the shell spec입니다. grep 버전이 -P을 지원하지 않는 발생하면
+0

철자를 분명히 고맙습니다. 방금 배운 것 같아. –

+0

고마워요! 내가 upvote 능력을 얻을 때, 나는 이걸로 돌아올거야. – Lenoxus

+0

@Lenoxus : 천만에요! 그건 그렇고, upvote 능력에 상관없이, 질문자는 그가 가장 도움이되는 것으로 보이는 대답을 "받아 들일"수 있습니다. 왼쪽에있는 녹색 체크 박스 개요를 클릭하십시오. 질문에 대한 답변이 충분하다고 판단되면 다른 사람들이 질문이 해결되었음을 알 수 있도록 적절한 대답을 "수락"하는 것이 예의입니다. – ruakh

2

기본적으로 grep은 \d을 포함하지 않는 POSIX regex flavor를 사용합니다. 표현식을 사용하려면 (인수 -P) PCRE로 전환

grep -P \\d{4} file.txt 

이 file.txt를 4 자리 문자열의 모든 인스턴스를 반환해야합니다.

+0

감사합니다. 그리고 누군가는 두 번째 부분을 설명 할 수 있습니까? – Lenoxus

2

, 다음이 작동합니다 다른 질문으로

grep "\d\{4\}" file.txt 

, 정규 표현식의 동일한 맛을 사용하여, .+은 다음에 모든 문자와 일치합니다 a + 표지판. .\+은 하나 이상의 문자와 일치합니다.

+2

Mac OS/X의 ** grep **에 해당하는 것에 주목할 가치가 있습니다 ... GNU grep (또는 egrep)은이 구문을 지원하지 않습니다. grep -P가 유일한 선택입니다. – tink