POSIX sed를 사용하여 행 연결

POSIX sed를 사용하여 행 연결

POSIX sed를 사용하여 행을 연결하려고 합니다.

--posix 없이 GNU sed를 사용하면 예상대로 작동합니다.

$ sed ':a; N; s/\n//; b a' <<< $'a\nb\nc'
abc

하지만 --posix를 사용하면 어떤 출력도 얻지 못합니다.

왜 그런 겁니까? 그렇지 않으면 어떻게 해야 합니까?

답변1

이것은 직업입니다 paste:

printf '%s\n' a b c | paste -sd '\0' -

(아니요, 이는 NUL로 조인하는 것이 아니라 POSIX에서 요구하는 대로 구분 기호 없이 조인하는 것입니다. 일부 paste구현에서는 이를 지원 paste -sd '' -하지만 이는 표준도 아니고 이식 가능도 아닙니다.)

비지박스 구현을 제외하고 입력이 비어 있으면 빈 줄을 출력으로 생성합니다(불행히도 과거의 버그/버그 기능이 이제 POSIX 사양에 새겨져 있습니다).

POSIX 사용 sed:

sed -e :a -e '$!{N;ba' -e '}' -e 's/\n//g'

또는:

sed '
:a
$!{
  N
  ba
}
s/\n//g'

b, :및 명령 }뒤에는 다른 명령이 올 수 없습니다. POSIX 사양의 이전 버전에서는 명명된 레이블로의 분기가 b a;s/a/b/필요했지만 , 최신 버전의 사양에서는 이제 GNU 동작을 허용하도록 지정되지 않았습니다. 다음 명령은 후속 표현식이나 별도의 줄에 있어야 합니다.ba;s/a/b/sed

POSIX에서는 N패턴 공간을 인쇄하지 않고 마지막 줄에서 종료해야 합니다. GNU는 sed변수가 환경에 존재하거나 옵션이 사용되는 경우와 같이 POSIX 모드에서만 이 작업을 수행합니다. 이것이 그 이유를 설명합니다.POSIXLY_CORRECT--posix--posix

또한 POSIX는 최소 8192바이트의 패턴 공간 크기를 보장합니다. 이 방법은 매우 작은 파일에만 이식할 수 있습니다. paste크기 제한이 없으며 sed이 방법과 달리 인쇄하기 전에 전체 파일을 메모리에 로드할 필요가 없습니다.

또 다른 방법은 입니다 tr -d '\n'. 그러나 paste/ 와는 달리 sed출력에 구분되지 않은 줄이 생성됩니다( 위의 예 abc대신 출력).abc\n

어쨌든, <<<연산자 zsh(현재 다른 쉘에서 지원됨)이고 $'...'ksh93 연산자(현재 대부분의 다른 POSIX 유사 쉘에서 지원됨)이며 POSIX 연산자도 아닙니다 sh(후자가 다음에 추가될 가능성이 있음). 표준 개정) 따라서 shPOSIX 스크립트에서 사용해서는 안 됩니다.

답변2

모든 UNIX 시스템의 모든 쉘에 있는 모든 awk의 경우, 모든 크기의 입력 파일에 대해(입력 파일이 단지 하나의 큰 텍스트 행이고 메모리에 맞지 않는 공백을 포함하지 않는 한):

$ printf '%s\n' a b c | awk -v ORS= '1; END{if (NR) print RS}'
abc

관련 정보