2016-08-19 3 views
0

egrep은 다음 예제에서 일치하지 않으며 읽어야 할 모든 항목에서 일치해야합니다. 표현은 '{% +'입니다. 달성하고자하는 것은 내 마크 업 파일에있는 모든 {% %} 대괄호에 일치하는 것입니다. 내 이해에서 {% 다음 하나 이상의 공백을 일치해야하지만 공백이없는 경우 일치하지 않습니다. PowerShell에서 동일한 표현식을 사용할 수 있으므로 일치하지 않으므로 궁금합니다. 예상대로 나를 위해egrep + 한정 기호가 작동하지 않습니다.

{% highlight ruby %} 
{% endhighlight %} 

cat file.md | egrep '{% +' 
+1

가'*'한정 기호로'+'한정 기호를 대체합니다

분명히, 다음을 사용하고 기대하는 결과를 얻을 수 있어야합니다. 문제가 무엇입니까? –

+0

*가 작동하지만 공간도 확보 할 수 있습니다. 어떻게 공간을 확보 할 수 있습니까? 나는 그것이 + 할 것이지만, 작동하지 않는 것 같습니다. – duffney

+0

'+'를 제거하고 작동하는지보십시오. 한정 기호는 1 개 이상 일치해야하므로 중복됩니다. 1이면''{% ''는 이미 충분합니다. 또한 공간이 아닌 탭이있을 수 있습니다. 리터럴 공간 대신'[[: blank :]]'를 시도하십시오. –

답변

1

, 당신의 정규식 작동에 대해

코드 조각이 일치합니다. 포함하는 입력 파일 file.md 감안할 때 :

{% highlight ruby %} 
{% endhighlight %} 
not this line, though 
nor {%this%} 

나는 당신의 명령 (UUoC을 피하는)를 실행, 나는 출력이 표시 얻을 :

$ egrep '{% +' file.md 
{% highlight ruby %} 
{% endhighlight %} 
$ 

당신은 당신이 사용하는 egrep의 버전을 확인하지했습니다 어떤 플랫폼을 사용하고 있는지 알려줍니다. 저는 Mac OS X 10.11.6을 실행 중이고 egrep (BSD grep) 2.5.1-FreeBSD을 사용하고 있습니다 (그러나 GNU Grep 2.25에서도 같은 결과를 얻었습니다).

그래도 {egrep의 메타 문자이며 예상 한대로 초기 {을 처리하지 못한다는 것을 알고 있어야합니다.

$ egrep '\{% {1,4}[a-z]{4,20} {1,4}%\}' file.md 
{% endhighlight %} 
$ 

내가 처음이자 마지막 중괄호를 피해 백 슬래시를 사용 :

예를 들어, 여기에만 endhighlight 라인을 선택해야 더 복잡한 egrep 호출합니다. {n,m} 표기법은 n ≤ x ≤ m의 앞의 정규식 (공백 및 [a-z])과 일치 함을 의미합니다. ,m을 생략 할 수 있습니다. {4,}도 사용할 수 있습니다 - 매뉴얼을 참조하여이를 이해하십시오. 하지만, 내 컴퓨터에, 나는 또한 실행할 수 있습니다 아마도

$ egrep '{% {1,4}[a-z]{4,20} {1,4}%}' file.md 
{% endhighlight %} 
$ 

를 첫 번째 {{n,m} 순서를 시작하지 않기 때문에, 그것은 일반 문자로 처리됩니다.

당신이 Extended Regular Expressions의 POSIX 사양을 보면, 당신이 그런 { 사용 말한다 찾을 수는 정의되지 않은 동작입니다 :

*+?{

(가) <asterisk>, <plus-sign>, <question-mark><left-brace>을하여야한다 꺽쇠 괄호 표현식 (RE 괄호 표현식 참조)에서 사용될 때를 제외하고는 특별해야합니다.이러한 문자는 ERE에 먼저 표시 또는 <left-brace>가 유효한 구간의 일부가 아닌 경우 즉시 <vertical-line>, <circumflex>, 또는 <left-parenthesis>

  • 을 다음과 같은 경우

    • : 다음과 같은 용도의 모든 정의되지 않은 결과를 표현은 (ERES는 여러 문자를 매칭)

  • 그래서, POSIX에 따라, 해당 페이지 정규식을 사용하는 정의되지 않은 결과를 발생시킵니다. 따라서 POSIX가 받아 들일 만하다고 판단되는 결과를 얻고 있습니다. 이 경우

    $ egrep '\{% +' file.md 
    {% highlight ruby %} 
    {% endhighlight %} 
    $ 
    
    +0

    {및}에 이스케이프 "\"문자를 사용하여 + 한정 기호를 예상대로 작동시킬 수있었습니다. 메타 문자라고 지적 해 주셔서 감사합니다. 전에는 효과가 없었던 이유를 이제는 완전히 이해합니다. 나는 또한 길고 상세한 설명에 크게 감사한다. 고맙습니다. 감사합니다. – duffney

    관련 문제