GNU grep의 -o 옵션은 길이가 0인 일치 항목을 무시합니까?

GNU grep의 -o 옵션은 길이가 0인 일치 항목을 무시합니까?

다른 웹사이트에서 제안된 답변을 찾았습니다 grep -oP '^\w+|$. 나는 이것이 PCRE에서 의미가 없다는 점을 지적했습니다 |$. 이는 단지 "OR 끝"을 의미하기 때문입니다. 따라서 이는 항상 일반 라인의 경우입니다. 그러나 grepGNU PCRE에서 정확히 무엇을 하는지는 알 수 없습니다 -o. 다음을 고려해보세요.

$ printf 'ab\na\nc\n\n' | perl -ne 'print if /ab|$/'
ab
a
c

$

$( 결과에 빈 줄이 포함되어 있음을 나타내기 위해 두 번째 프롬프트( ) 문자를 포함했습니다 .)

Perl에서 예상한 대로 모든 라인과 일치합니다. 하나를 포함하거나 줄의 끝과 일치 ab하기 때문 입니다. $GNU는 플래그 없이도 grep동일한 방식으로 동작합니다 -o.

$ printf 'ab\na\nc\n\n' | grep -P 'ab|$'
ab
a
c

$

그러나 -o동작이 변경되었습니다.

$ printf 'ab\na\nc\n\n' | grep -oP 'ab|$'
ab
$

이는 단순히 grep for 와 동일합니다 ab. 두 번째 부분인 "OR end of line"은 무시되는 것 같습니다. 예상대로 작동하며 -o플래그가 없습니다.

어떻게 되어가나요? - o0개의 길이 일치를 무시하시겠습니까? 이것은 버그입니까, 아니면 예상된 것입니까?

답변1

내 GNU grep 매뉴얼 페이지는 다음과 같습니다.

-o, --match만 해당

일치하는 것만 인쇄(비어 있지 않음)는 라인의 일부와 일치하며, 각 부분은 별도의 출력 라인에 있습니다.

요점은 내꺼야

나는 라인 끝 일치를 "널 일치"로 간주한다고 생각합니다.

답변2

수술실 양쪽

두 번째 부분인 "OR end of line"은 무시되는 것 같습니다.

아니요, 그렇지 않습니다. 매칭을 약간 변경하면 다음과 같습니다.

$ printf 'ab\na\n\nc\n' | grep -oP 'ab|.$'
ab
a
c

두 부분또는분명한 일치입니다.

빈 성냥

무엇"빈" 일치 항목은 무시됩니다(결과 문자열의 길이는 0입니다).

$ printf '%s\n' ab " " a "" c | grep -oP '^.*$'
ab

a
c

문서화되어 있습니다 (GNU grep) LESS=+'/^ *-o,' man grep(강조):

-o, --match만 해당
Print only the matched (비어 있지 않음) parts of a matching line, with each such part on a separate output line.

관련 정보