Linux에서는 echo foo | grep -o '^.'
첫 번째 문자를 얻으면 f
예상대로 인쇄됩니다. (알아요, | cut -c1
더 빠를 수도 있어요.)
그러나 OSX에서는 3개의 일치 항목(3줄)에서 동일한 결과를 수행합니다.
f
o
o
뭐하세요? 해당 옵션이 없더라도 -o
(내 환경에서) 출력 색상을 보면 첫 번째 문자뿐만 아니라 전체 줄이 일치한다는 것을 알 수 있습니다.
누군가 나를 깨달을 수 있습니까?
답변1
여러분은 이것이 흥미로운 행동이라는 것을 알아차렸습니다.
이것을 "버그"로 분류하는 것은 실수입니다.POSIX -o
옵션이 지정되지 않았습니다.grep
. 여러분은 이것이 동작하는 방식이 마음에 들지 않을 수도 있고 grep
BSD와 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는 grep
3초를 인쇄합니다 foo
.
기본 버전을 심볼릭 링크로 교체하는 경우 ggrep
일부 운영 체제 업데이트가 이를 대체한다는 점에 유의하세요.