GNU sed --posix 및 대체 문자열의 개행 문자

GNU sed --posix 및 대체 문자열의 개행 문자

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

이스케이프 시퀀스 '\n'은 패턴 공간에 포함된 <newline>과 일치해야 합니다.리터럴 <newline>은 사용되지 않습니다.컨텍스트 주소의 BRE에서 또는대체 기능에서.

플래그가 있는 다음 GNU sed명령은 --posix대체 함수에 개행 문자가 사용되기 때문에 해당 사양에 위배됩니다.

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

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

답변1

"리터럴 <newline>은 사용되지 않습니다.", 귀하의 예에는 리터럴 개행이 사용되지 않습니다. 따라서 표준의 이 부분은 관련이 없습니다.

\n~이다~ 아니다문자 그대로의 개행 문자.

답변2

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

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

이스케이프되지 않은 <backslash> 바로 뒤에 '&', <backslash>, 숫자, <newline> 또는 이 명령에 사용된 구분 기호 문자 이외의 문자가 오는 의미는 지정되지 않습니다.

따라서 , , 개행 문자 x로 바꾸고 , 오류를 보고하고, 컴퓨터를 재부팅하는 것은 모두 규정을 준수하는 동작입니다. GNU가 그곳에서 동작을 바꾸고 싶어할 이유가 없습니다 .n\nsed

적합애플리케이션(즉, 이 경우 스크립트)는 \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'으로 바꾸는 것은 개행을 도입하는 것을 의미한다고 말합니다. 현명한.

관련 정보