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 동작을 허용하도록 지정되지 않았습니다. 다음 명령은 후속 표현식이나 별도의 줄에 있어야 합니다.b
a;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
(후자가 다음에 추가될 가능성이 있음). 표준 개정) 따라서 sh
POSIX 스크립트에서 사용해서는 안 됩니다.
답변2
모든 UNIX 시스템의 모든 쉘에 있는 모든 awk의 경우, 모든 크기의 입력 파일에 대해(입력 파일이 단지 하나의 큰 텍스트 행이고 메모리에 맞지 않는 공백을 포함하지 않는 한):
$ printf '%s\n' a b c | awk -v ORS= '1; END{if (NR) print RS}'
abc