BSD sed 및 gsed의 줄바꿈

BSD sed 및 gsed의 줄바꿈

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--posix10sed

이는 GNU가 sed기본적으로 명령의 POSIX 정의 부분을 무시하기 때문입니다 sed N.

다음 입력 줄을 사용할 수 없는 경우 N명령 동사는 스크립트 끝으로 분기하고 새 루프를 시작하거나 패턴 공간을 표준 출력에 복사하지 않고 종료해야 합니다.

또한 새 루프가 시작되기 때문에 프로그램이 p실행 되지 않습니다.sedD

관련 정보