GNU sed - 문자열에서 posix 및 개행 문자 교체

GNU sed - 문자열에서 posix 및 개행 문자 교체

POSIX sed사양 에서이 진술찾을 수 있습니다 (내 강조) :

이스케이프 시퀀스 '\n'은 패턴 공간에 포함된 <newline>과 일치해야 합니다.<newline> 텍스트를 사용하면 안 됩니다.컨텍스트 주소의 BRE에서 또는대체 기능에서.

다음 플래그가 지정된 sedGNU 명령은 --posix대체 함수에 개행 문자를 사용하기 때문에 이 사양에 위배됩니다.

$ printf '1X2' | sed --posix 's|X|\n|'
1
2

그렇다면 왜 sed오류 메시지를 표시하는 대신 개행 문자를 삽입하는 걸까요?

답변1

"리터럴 <newline>을 사용해서는 안 됩니다.", 예제에서는 리터럴 개행 문자가 사용되지 않습니다. 따라서 표준의 이 부분은 관련이 없습니다.

\n아니요리터럴 개행 문자입니다.

답변2

--posix플래그는 GNU sedPOSIX를 준수하게 만듭니다.

POSIX는 지정되지 않은 동작을 예약합니다 s/x/\n/.

지정되지 않은 <백슬래시> 뒤에 "&", <백슬래시>, 숫자, <newline> 또는 이 명령에 사용된 구분 기호 이외의 문자가 오는 의미는 지정되지 않습니다.

따라서 x로 바꾸거나 n, 사용하거나 \n, 개행 문자를 사용하거나, 오류를 보고하고, 컴퓨터를 다시 시작하는 것은 모두 합법적인 행위입니다. GNU가 sed자신의 행동을 바꾸고 싶어할 이유가 없습니다 .

자격을 갖춘애플리케이션(즉, 이 경우 스크립트)는 \n거기에서 사용되어서는 안 됩니다. 이것이 바로 당신이 인용한 텍스트에 관한 것입니다.

차이점은 POSIX에서는 및 s/[\t]/x/g교체가 모두 필요하며 이에 따라 GNU의 동작이 변경되는 것을 볼 수 있다는 것입니다. 의 경우 POSIX 사양이 실제로 모호합니다. GNU는 동작을 변경하여 및 를 로 대체했지만 이것이 필요한지는 확실하지 않습니다.\txsed--posixs/[\n]/x/gsed--posix\nx

답변3

이 표준은 다음과 같이 규정하고 있습니다.검색 모드(BRE, 기본 정규식, POSIX 언어) 명시적 줄바꿈은 사용할 수 없으며, 줄바꿈은 '\n'으로 표시되며 사용할 수 없습니다.대안누구나.

검색 패턴에 명시적인 줄바꿈이나 "\n"으로 표시되는 줄바꿈이 포함되어 있지 않습니다. 대체 항목에 "\n"이 있습니다. 위의 내용은 대체 텍스트에 줄바꿈(있는 경우)이 어떻게 표시되는지 설명하지 않습니다. GNU sed는 이전 명령문을 채택하고 이를 '\n'으로 바꾸는 것은 개행 문자를 도입하는 것을 의미합니다. 현명한.

관련 정보