답변:
당신은 욕심이없는 (또는 게으른) 성냥을 찾고 있습니다. 정규 표현식에서 욕심없는 일치를 얻으려면 ?
수량화 후 수정자를 사용해야합니다 . 예를 들어, 당신은 변경할 수 있습니다 .*
로 .*?
.
기본적 grep
으로 욕심없는 수정자를 지원하지 않지만 grep -P
Perl 구문을 사용하는 데 사용할 수 있습니다 .
.
에서 개행을 일치 시키는 모드를 DOTALL 또는 단일 라인 모드 라고 합니다. 루비는 멀티 라인 이라고하는 유일한 제품 입니다. 다른 특징에서, 멀티 라인 은 앵커 ( ^
및 $
)를 선 경계에서 일치 시킬 수있는 모드입니다 . 루비에서는 항상 그런 식으로 작동하기 때문에 루비에는 동등한 모드가 없습니다.
-P
나에게 완전한 새로운 것이었고, 나는 행복하게 몇 년 동안 쫓아 -E
왔습니다. -자기 자신에 대한 참고 사항 : 매뉴얼 페이지를 (더 많은!) 규칙적인 것으로 다시 읽으십시오. 스위치와 옵션을 충분히 요약하지 마십시오.
grep
지원하지 않습니다 -P
,하지만 당신이 사용하는 경우 egrep
에는 사용할 수있는 .*?
동일한 결과를 달성하기 위해 패턴을. egrep -o 'start.*?end' text.html
-P
만 -E
부를 것이다 egrep
, 따라서 제안 된 .*?
잘 작동합니다.
실제로 .*?
유일하게 작동합니다 perl
. 동등한 grep 확장 regexp 구문이 무엇인지 잘 모르겠습니다. 다행히도 grep과 함께 perl 구문을 사용할 수 있으므로 grep -P
작동하지만 작동하지 않는 grep -E
것과 동일 egrep
합니다 (욕심이 많음).
참조 : http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
grep -P
바로 자동으로 적용되지 않습니다 (이 오류가 나던 바로 그것을 시도 - GNU에없는 일이 2.9 grep을 않습니다 ?
Intertestly 어느 쪽도하지 않습니다. 클래스가 아닌 예는 :env|grep '[^\=]*\='
grep -P
옵션이나 pgrep
명령이 없지만 egrep
훌륭하게 작동합니다.
pgrep
내 OS X 10.9 상자에 명령하지만, 그 목적은 "이름으로 찾기 또는 신호 프로세스"에있는 완전히 다른 프로그램입니다.
이 스레드에서 물건을 시험해 본 후에 작동하는 내 grep :
echo "hi how are you " | grep -shoP ".*? "
각 줄에 공백을 추가하십시오.
(마인은 한 줄씩 검색하여 단어를 뱉어 냈습니다)
-shoP
nice mnemonic :)
echo "bbbbb" | grep -shoP 'b.*?b'
약간의 학습 경험입니다. 명시 적으로 게으른 측면에서 나를 위해 일한 것 만.
짧은 대답은 다음 정규식을 사용하는 것입니다.
(?s)<car .*? model=BMW .*?>.*?</car>
좀 더 복잡한 대답은 다음과 같습니다.
(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>
다음 텍스트에서 car1과 car2를 일치시킬 수 있습니다.
<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
늦어서 죄송합니다. 2020 년에는 시청자에게 효과가있을 수 있습니다.
따라서 같은 줄이 있다고 가정하십시오 "Hello my name is Jello"
. 이제 사이에 임의의 수의 문자가있는로 시작 'H'
하고 끝나는 단어를 찾으려고합니다 'o'
. 그리고 우리는 단어 만 원하는 줄을 원하지 않습니다. 이를 위해 다음 표현식을 사용할 수 있습니다.
grep "H[^ ]*o" file
이것은 모든 단어를 반환합니다. 이것이 작동하는 방식은 다음과 같습니다. 공백 문자 대신 모든 문자를 허용하므로 같은 줄에서 여러 단어를 피할 수 있습니다.
이제 공백 문자를 원하는 다른 문자로 바꿀 수 있습니다. 초기 줄이라고 가정하면 "Hello-my-name-is-Jello"
표현식을 사용하여 단어를 얻을 수 있습니다.
grep "H[^-]*o" file