이 sed 명령에 전송하기 위해 cat과 echo를 사용하는 것 사이에 불일치가 있는 이유는 무엇입니까?

이 sed 명령에 전송하기 위해 cat과 echo를 사용하는 것 사이에 불일치가 있는 이유는 무엇입니까?

이 질문에서 영감을 얻었습니다.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입력은 개행에서만 다릅니다.

관련 정보