이 사이트에 제공된 답변을 사용하는 데 몇 가지 문제가 있습니다.이 질문은 빈 줄을 다른 두 줄로 바꾸는 sed 명령에 관한 것입니다., Mac OS(나의 경우 10.6.7)에서 sed 명령이 다른 경우 이 문제가 발생합니다. 나는 그렇게 생각하지 않지만, 이 사이트의 다른 사람들은 다르게 생각하는지 궁금합니다.
답변1
OS X는 현재 2005년의 FreeBSD sed와 함께 제공됩니다. 아래 차이점의 대부분은 다른 BSD sed 버전에도 적용됩니다.
OS X의 sed는 -E
ERE용이고 GNU sed는 -r
. -E
GNU sed의 별칭입니다 -r
(4.2에 추가되었으며 4.3까지 문서화되지 않았습니다). 최신 버전의 FreeBSD 및 NetBSD는 sed -E
와 -r
. OpenBSD sed는 -E
.
-i ''
OS X의 sed에서는 작동하지만 GNU sed에서는 작동하지 않습니다. -i
GNU sed, 최신 버전의 NetBSD 및 OpenBSD에서는 작동 sed
하지만 OS X의 sed에서는 작동하지 않습니다. -i -e
둘 다 작동하지만 FreeBSD의 경우 sed
원본 파일의 복사본이 파일 이름에 추가됩니다 -e
(그리고 하나 이상의 표현식을 전달해야 합니다 sed
).
\s
GNU sed는 , \t
, \n
, \001
, \x01
, \w
및 와 같은 이스케이프 시퀀스를 해석합니다 \b
. OS X의 sed 및 POSIX sed에 대해서만 설명합니다 \n
(대체 섹션에서는 설명하지 않음 s
).
GNU sed는 BRE에서 \|
, 및 를 해석 \+
하지만 \?
OS X sed 및 POSIX sed는 그렇지 않습니다. \(
, \)
, \{
및 \}
는 POSIX BRE입니다.
GNU sed는 ;
선행 생략 또는 개행을 허용 }
하지만 OS X의 sed는 허용하지 않습니다.
i
OS X의 sed 및 POSIX sed에서 (삽입), a
(추가) 및 c
(변경) 뒤에는 백슬래시와 개행 문자가 와야 하지만 GNU sed에서는 그렇지 않습니다. GNU sed는 i
, a
또는 삽입된 텍스트 뒤에 누락된 줄 바꿈을 추가 c
하지만 OS X의 sed는 그렇지 않습니다. 예를 들어, sed 1ia
GNU를 대체합니다 sed $'1i\\\na\n'
.
예를 들어 printf a|sed -n p
OS X의 sed에는 개행 문자가 추가되지만 GNU sed에서는 추가되지 않습니다.
I
OS X용 sed는 (대소문자 구분) 또는 (여러 줄) 수정자를 지원하지 않습니다 M
. 최신 버전의 FreeBSD는 sed를 지원합니다 I
.
-s
OS X의 sed는 ( --separate
), -u
( --unbuffered
), -z
( ) 를 지원하지 않습니다 --null-data
.
GNU sed가 지원하지 않는 BSD 옵션 중 하나는 파일을 자르는 대신 파일에 추가한다는 -a
것 입니다.w
OS X sed에서 작동하지 않는 GNU sed 명령의 예:
sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping
답변2
서로 다른 UNIX 변형 간에는 쉘 유틸리티의 동작에 미묘한 차이가 있습니다. 많이있다유닉스변형,복잡한 역사. 가지다표준화 작업그렇게POSIX표준과 그 상위 집합단일 UNIX 사양. 오늘날 대부분의 시스템은 POSIX:2001이라고도 알려진 POSIX:2001을 구현합니다.단일 UNIX 사양 버전 3, 약간의 편차와 많은 확장이 있습니다. Single Unix 사양은 튜토리얼이 아니지만 명령의 용도를 이미 알고 있다면 제3판을 읽어보세요. 이를 참조하여 특정 기능이 표준인지 아니면 시스템별 확장인지 확인할 수 있습니다.
대부분의 Unix 사용자는 Linux를 사용하며 다른 변형은 사용하지 않습니다. 리눅스와 함께 제공되는암소 비슷한 일종의 영양표준에 대한 많은 확장이 포함된 유틸리티입니다. 따라서 많은 코드가 Linux에서는 실행되지만 이러한 확장에 의존하기 때문에 다른 unices에서는 실행되지 않는다는 것을 알게 될 것입니다.
sed에 대해서는 다음을 참조하세요.sed 단일 유닉스 사양모든 시스템이 지원해야 하는 최소한의 경우,시스템의 매뉴얼 페이지귀하의 구현은 무엇을 지원합니까?GNU sed 매뉴얼대부분의 사람들이 사용하는 것.
GNU sed의 비표준 확장 중 하나는 여러 명령을 함께 실행할 수 있도록 지원하는 것입니다. 예를 들어, 다음 GNU sed 프로그램은 가 포함된 모든 행을 인쇄 a
하지만 첫 번째 행 b
으로 변경되었습니다.c
sed -ne '/a/ {s/b/c/g; p}'
{
및 }
실제로는 별도의 명령이므로 완전한 이식성을 위해서는 별도의 줄(파일에서)이나 별도의 -e
인수(명령줄에서)에 지정해야 합니다. 다음 누락된 명령 구분 기호 {
및 ;
명령 구분 기호로 사용하는 것은 일반적인 확장입니다. 이전에는 명령 구분 기호가 부족했던 것이 }
덜 일반적인 확장이었습니다. 이것은 표준입니다:
sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'
이는 비표준이지만 일반적으로 허용됩니다.
sed -ne '/a/ { s/b/c/g; p; }'
또 다른 비표준이지만 일반적인 확장은 \n
대체 텍스트에서 줄 바꿈을 나타내는 데 사용됩니다 s
(정규 표현식에서의 사용은 표준입니다). 이식 가능한 접근 방식은 sed 스크립트에 백슬래시 줄 바꿈을 포함하는 것입니다. 또 다른 일반적인 확장자는 정규식 \+
에서 하나 이상, 최대 하나 및 교대를 의미합니다.\?
\|
이식 가능한 기본 정규식이것들 중 아무것도 아닌. 예를 들어, 첫 번째 명령은 연속된 공백 시퀀스를 줄 바꿈으로 바꾸는 이식 불가능한 방법입니다. 두 번째 명령은 표준을 준수하는 명령입니다.
sed -e 's/ \+/\n/'
sed -e 's/ */\
/'
답변3
Linux와 Mac에서 동일한 스크립트를 사용하는 가장 좋은 방법은 다음과 같습니다.
sed -i.bak -e 's/foo/bar/' -- "${TARGET}" &&
rm -- "${TARGET}.bak"
답변4
또 다른 차이점은 UTF-8로 설정된 LANG 또는 LC_CTYPE을 사용하여 바이너리 파일을 처리하려고 하면 Mac/BSD sed
발생할 수 있다는 것입니다 . 오류는 발생하지 않습니다.error: illegal byte sequence
GNU sed
Mac/BSD에서 이 오류가 발생하면 다음 방법 중 하나를 시도해 볼 수 있습니다.
LC_CTYPE=C sed ...
LC_ALL=C sed ...
LANG=C sed ...