grep -o OSX에서의 동작

grep -o OSX에서의 동작

Linux에서는 echo foo | grep -o '^.'첫 번째 문자를 얻으면 f예상대로 인쇄됩니다. (알아요, | cut -c1더 빠를 수도 있어요.)

그러나 OSX에서는 3개의 일치 항목(3줄)에서 동일한 결과를 수행합니다.

f
o
o

뭐하세요? 해당 옵션이 없더라도 -o(내 환경에서) 출력 색상을 보면 첫 번째 문자뿐만 아니라 전체 줄이 일치한다는 것을 알 수 있습니다.

누군가 나를 깨달을 수 있습니까?

답변1

여러분은 이것이 흥미로운 행동이라는 것을 알아차렸습니다.

이것을 "버그"로 분류하는 것은 실수입니다.POSIX -o옵션이 지정되지 않았습니다.grep. 여러분은 이것이 동작하는 방식이 마음에 들지 않을 수도 있고 grepBSD와 GNU의 차이점이 짜증난다는 점에는 동의합니다 . 그러나 이 동작은 실제로 BSD 매뉴얼 페이지에 나와 있는 내용과 충돌하지 않습니다. 아직도 버그라고 말한다면, 그건,당신의보다, 남성. :)

어쩌면 이 대체 데모가 왜 작동하는지 보여줄 것입니다:

$ echo foofoofoo | grep -o foo
foo
foo
foo

즉, BSD grep와 GNU가 모두 grep표시됩니다.모두첫 번째 줄뿐만 아니라 줄의 일부도 일치시킵니다. 차이점은 BSD가 grep일치하는 부분을 소비한 다음 다시 일치시켜 이를 수행하는 것 같다는 것입니다. f예제에서 선행을 제거하면 o다음 항목도 일치하고 다음 항목도 일치한다는 것을 알게 됩니다.

이 문제를 해결하는 한 가지 방법은 설치하는 것입니다.스스로 만든, 그리고 말했다 brew install grep. 이렇게 하면 GNU가 제공되므로 grep기본 ggrep버전과 충돌하지 않습니다. GNU는 grep위의 예와 동일한 동작을 제공하지만 몇 가지 차이점이 있습니다.

 $ echo foofoofoo | ggrep -o ^foo
 foo

BSD는 grep3초를 인쇄합니다 foo.

기본 버전을 심볼릭 링크로 교체하는 경우 ggrep일부 운영 체제 업데이트가 이를 대체한다는 점에 유의하세요.

관련 정보