
FreeBSD 11.2 p7과 함께 제공되는 sed는 다음을 제공합니다:
$ seq 10 | sed 'N; l; D; p'
1$
2$
2$
3$
3$
4$
4$
5$
5$
6$
6$
7$
7$
8$
8$
9$
9$
10$
gsed (GNU sed 4.7)는 동일한 스크립트를 제공합니다.
$ seq 10 | gsed 'N; l; D; p'
1\n2$
2\n3$
3\n4$
4\n5$
5\n6$
6\n7$
7\n8$
8\n9$
9\n10$
10
이러한 행동 차이를 어떻게 설명할 수 있나요?
답변1
BSD는 시각적으로 명확한 형식으로 문자를 출력하는 sed
데 사용되는 경우 l
시각적으로 명확한 형식으로 개행을 출력하지 않습니다.
~에서sed(1)OpenBSD에서:
[2addr]l
(The letter ell.) Write the pattern space to the standard output
in a visually unambiguous form. This form is as follows:
backslash \\
alert \a
backspace \b
form-feed \f
carriage-return \r
tab \t
vertical tab \v
(개행 문자에 대한 언급은 없습니다.)
그러나 GNU는 sed
명시적인 표시를 위해 문자 집합에 개행 문자를 포함합니다. 문자 집합의 확장으로 이 작업을 수행합니다.POSIX 표준sed
언급되었습니다(이것은 BSD에서 사용되는 컬렉션입니다 sed
). GNU는 명령줄에서 사용될 sed
때에도 --posix
이런 방식으로 동작합니다 .
GNU는 sed
또한 10
두 번 출력하지만 BSD는 sed
그렇지 않습니다. set 또는 with 를 사용하여 GNU를 sed
실행하면 BSD처럼 한 번만 출력됩니다 .POSIXLY_CORRECT
--posix
10
sed
이는 GNU가 sed
기본적으로 명령의 POSIX 정의 부분을 무시하기 때문입니다 sed
N
.
다음 입력 줄을 사용할 수 없는 경우
N
명령 동사는 스크립트 끝으로 분기하고 새 루프를 시작하거나 패턴 공간을 표준 출력에 복사하지 않고 종료해야 합니다.
또한 새 루프가 시작되기 때문에 프로그램이 p
실행 되지 않습니다.sed
D