BSD sed 대 GNU - 일치 항목을 중첩할 수 있습니까?

BSD sed 대 GNU - 일치 항목을 중첩할 수 있습니까?

이는 모든 Linux에서 완벽하게 작동합니다.

$ echo foo bar | sed -n '/foo/{/bar/{;p;}}'
foo bar

그러나 OSX의 이전 BSD 변형에서는 실패합니다.

❯  echo foo bar | sed -n  '/foo/{/bar/{;p;}}' 
sed: 1: "/foo/{/bar/{;p;}}": extra characters at the end of } command

제가 마법 주문을 놓친 걸까요? 이식 가능한 방식으로 작성하는 방법이 있나요?

grep | grep | grep명령 파이프라인 으로 되돌리고 싶지 않습니다 .

업데이트: 여기에는 대표성이 낮아 투표할 수 없습니다. 하지만 사려 깊은 제안에 응답해 주신 모든 분들께 감사드립니다.

답변1

편집 명령은 개행 문자 또는 리터럴 개행 문자로 종료되어야 합니다 sed. ;GNU는 sed이에 대해 매우 관대합니다.

귀하의 스크립트:

/foo/{/bar/{;p;}}

확장:

/foo/{
    /bar/{
        p
    }
}

이는 를 통해 sed공급되는 sed스크립트로 작동 합니다 -f.

명령줄에서 사용할 수 있도록 개행 문자를 ;(명령 및 명령 그룹 끝에만 필요 ) 로 바꾸면 다음과 같은 결과를 얻을 수 있습니다.{...}

/foo/{/bar/{p;};}

이것은 OpenBSD에서 작동합니다 ( 두 번째 버전이 없기 sed때문에 원래 버전은 작동하지 않습니다 ).;

이 특별한 경우에는 다음과 같이 더욱 단순화할 수 있습니다.

/foo/{/bar/p;}

답변2

이것은 BSD에서 작동하는 것 같습니다 sed.

$ echo -e "foo bar\nfoo\nbar" | sed -n '/foo/{/bar/p;}'
foo bar

두 가지 수준의 중첩에도 동일하게 적용됩니다.

$ echo -e "foo bar\nfoo\nbar" | sed -n '/foo/{/bar/{p;};}'
foo bar

관련 정보