이는 모든 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