이 질문에서 영감을 얻었습니다.sed:N 명령이 한 줄을 읽지 않습니다.다음 두 명령 사이에 불일치가 발생하는 이유를 알고 싶습니다.
#1.에코
이 명령은 출력을 생성하지 않습니다.
$ echo -en 'abc\n' | sed -n 'N;p'
$
출력의 16진수 덤프 echo
:
od - 8진수 덤프
$ echo -en 'abc\n' | od -tx1
0000000 61 62 63 0a
0000004
16진수 덤프
$ echo -en 'abc\n' | hexdump -C
00000000 61 62 63 0a |abc.|
00000004
#2.고양이
"abc\n" 문자열을 다음과 같이 파일에 넣으면:
1: abc
2:
abc
이것은 문자열이 있고 그 뒤에 줄바꿈( \n
일명 )이 오는 줄입니다 0x0A
. 그런 다음 이전과 같이 파이핑하면 다음과 같습니다 sed
.
$ cat abc.txt | sed -n 'N;p'
abc
$
출력에는 문자열 abc
과 2개의 개행 문자가 포함됩니다.
od - 8진수 덤프
$ cat abc.txt | od -tx1
0000000 61 62 63 0a 0a
0000005
16진수 덤프
$ cat abc.txt | hexdump -C
00000000 61 62 63 0a 0a |abc..|
00000005
좀 당황스럽네요. 무슨 일인가요?
고쳐 쓰다
abc.txt
알았어 내 질문은 파일을 어떻게 만드는 거야?@choroba가 지적했습니다. 파일을 만드는 중이었지만 vim
줄 바꿈이 2개 추가되었다는 사실을 몰랐습니다. 특수 문자의 가시성을 활성화하면 더욱 분명해집니다.
:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<,
:set list
이제 vim
파일은 abc.txt
다음과 같습니다.
abc$
$
파일을 다음과 같이 생성하면@choroba가 제안함그러면 파일이 abc.txt
예상대로 표시됩니다.
$ cat abc.txt | od -tx1
0000000 61 62 63 0a
0000004
echo
원래 예제와 동일하게 동작합니다 .
$ cat abc.txt | sed -n 'N;p'
$
원래의
sed -n 'N;p'
아무것도 표시되지 않는 이유에 대한 원래 질문에 대한 답변이 있었습니다. 감사합니다.@엔조팁답변. POSIX 표준에서는 이것을 눈치채지 못했습니다.
다음 입력 줄을 사용할 수 없는 경우 N 명령 동사는 스크립트 끝으로 분기하고 새 루프를 시작하거나 패턴 공간을 표준 출력에 복사하지 않고 종료해야 합니다.
답변1
이 파일을 어떻게 만들었나요? 여기에는 하나가 아닌 두 개의 개행 문자가 포함되어 있습니다. 다시 시도하십시오
echo abc > abc.txt
cat abc.txt | sed -n 'N;p'
답변2
POSIX 표준에는 다음과 같이 명시되어 있습니다.
[2주소]질소원본 자료에서 추가된 자료를 분리하기 위해 포함된 <newline>을 사용하여 다음 입력 줄(종료 <newline> 제외)을 패턴 공간에 추가합니다. 현재 줄 번호가 변경됩니다.다음 입력 줄을 사용할 수 없는 경우 N 명령 동사는 스크립트 끝으로 분기하고 새 루프를 시작하거나 패턴 공간을 표준 출력에 복사하지 않고 종료해야 합니다..
따라서 다음 줄이 있든 없든 동작은 매우 다릅니다.
출력에서 볼 수 있듯이 od -x
입력은 개행에서만 다릅니다.