Gnu sed, 인쇄할 때 p 명령이 개행 문자를 추가합니까?

Gnu sed, 인쇄할 때 p 명령이 개행 문자를 추가합니까?
root@u1804:~# sed --version
sed (GNU sed) 4.5
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <https://www.gnu.org/software/sed/>.
General help using GNU software: <https://www.gnu.org/gethelp/>.
E-mail bug reports to: <[email protected]>.
root@u1804:~#

저는 sed를 처음 접했고 제가 이해한 내용을 바탕으로 다음과 같은 sed 워크플로를 만들었습니다(실수를 발견하면 수정해 주세요).

여기에 이미지 설명을 입력하세요.

따라서 패턴 공간의 기본 자동 인쇄에는 항상 끝에 개행 문자가 포함되는 것 같습니다. 제 질문은 p줄 바꿈도 포함됩니까? 다음 예가 있습니다.

root@u1804:~# seq 3 | sed -rn 'p'
1
2
3
root@u1804:

여기서 각 숫자 끝에 있는 개행 문자는 sed 자체에 의해 추가됩니다(그림 "패턴 공간에 개행 문자 다시 추가" 참조). 따라서 p개행 문자가 추가되지 않은 것 같습니다. 그러나 아래 예를 참조하십시오.

root@u1804:~# seq 3 | sed -rn 'x;p;x;p'

1

2

3
root@u1804:~#

여기서 x패턴 공간은 홀드 공간과 교체되어 패턴 공간이 비어 있게 됩니다. 이제 p패턴 공간(아무것도 포함하지 않음)에 적용하면 아무것도 인쇄되지 않습니다. 하지만 결과에 따르면 p여기에 개행 문자가 인쇄된 것처럼 보입니다. 제가 보기엔 이는 일관성 없는 행동인 것 같습니다. 누구든지 이것을 설명할 수 있나요?

답변1

주요 질문에 답하려면:

GNU는 입력 줄에 종료 문자가 누락되지 않는 한 명령을 실행할 때 문자를 추가합니다 sed(아래 줄 설명 참조).<newline>p<newline>

내가 아는 한, sed플래그 p와 해당 자동 인쇄 기능은 패턴 공간을 출력하기 위해 동일한 논리를 구현합니다. <newline>후행 문자가 제거되면 다시 추가하고, 후행 문자가 제거되면 다시 추가합니다. 그렇지 않으면 그렇지 않습니다.

예:

$ printf '%s\n%s' '4' '5' | sed ';' | hexdump -C      # auto-print
00000000  34 0a 35                                          |4.5|
00000003
$ printf '%s\n%s' '4' '5' | sed -n 'p;' | hexdump -C  # no auto-print; p flag
00000000  34 0a 35                                          |4.5|
00000003

<newline>두 경우 모두 문자가 없는 입력 줄( )의 경우 출력에 문자( )가 없습니다 .0a


차트 정보:

"패턴 공간에 개행 문자 추가"는 <newline>문자가 배치되지 않았기 때문에 정확하지 않을 수 있습니다.존재하다패턴 공간 1. 또한 이 단계는 옵션과 관련이 없지만 -n차트를 만들지는 않습니다.잘못된;대신 "인쇄 모드 공간"에 병합되어야 할 것입니다.
그러나 문서의 명확성이 부족하다는 점에 동의합니다.

1 당신이 인용한 문장당신 자신의 대답에, "패턴 공간의 내용이 출력 스트림에 인쇄되고 후행 개행 문자가 제거되면 다시 추가됩니다."는 <newline>패턴 공간이 아닌 스트림에 추가된다는 의미입니다. 물론, 패턴공간이 빠르게 클리어되기 때문에 이는 아주 사소한 문제이다.


플래그와 관련된 테스트에 관하여 x:

내부적으로는 패턴 공간과 예약 공간이 모두 구조인데, " <newline>내 뒤따르는 문자가 제거되었나요?"도 그 중 하나입니다. 우리는 그것을 부를 것이다씹었다sed(BTW, 소스 코드에 이름이 지정되어 있음).
패턴 공간은 읽기 라인과 해당 라인으로 채워집니다.씹었다속성은 줄이 끝나는 방식에 따라 달라집니다. true즉, 문자로 끝나는 경우 <newline>, false그렇지 않은 경우입니다. 반면, 보유 공간은 비워져 초기화되며,씹었다속성이 방금 으로 설정되었습니다 true.
따라서 패턴 공간을 교환하고 공간을 예약하고 원래는 예비였으며 이제는 패턴이 된 것을 인쇄하면 <newline>문자가 인쇄됩니다.

예 - 다음 명령은 동일한 출력을 갖습니다.

$ printf '\n' | sed -n 'p;' | hexdump -C        # input is only a <newline>
00000000  0a                                                |.|
00000001
$ printf '%s' '5' | sed -n 'x;p;' | hexdump -C  # input has no <newline>
00000000  0a                                                |.|
00000001

sed( 코드를 잠깐 훑어봤기 때문에 정확하지 않을 가능성이 높습니다.)


라인에 대해 (설명은 코멘트로 시작됩니다너의 답):

그것은 말할 것도 없다,철사종결 문자가 없다는 것은 <newline>문제가 있는 개념입니다. 인용하다POSIX:

3.206라인
<newline>0개 이상의 비문자와 종료 문자의 시퀀스입니다 <newline>.

또한,POSIX텍스트 파일을 정의합니다.

3.403 텍스트 파일
0개 이상의 줄로 구성된 문자가 포함된 파일입니다. ...

마침내,POSIX(굵은 광산) 정보 sed:

설명하다
sed유틸리티는 하나 이상의 스트림 편집기입니다.텍스트 파일, 편집 명령의 스크립트를 기반으로 편집 변경을 수행하고 결과를 표준 출력에 기록합니다. ...

암소 비슷한 일종의 영양sed그러나 입력을 정의하는 데에는 덜 엄격한 것 같습니다.

sed스트림 편집기입니다. 스트림 편집기는 입력 스트림(파일 또는 파이프의 입력)에서 기본 텍스트 변환을 수행하는 데 사용됩니다. ...

sed따라서 첫 번째 문장과 관련하여 GNU의 경우 패턴 공간으로 읽혀지는 내용이 반드시 잘 구성된 텍스트 줄은 아니라는 점을 고려해야 합니다 .

답변2

fra-san의 답변을 기반으로 업데이트된 다이어그램만 포함하도록 답변을 편집했습니다. 유일한 목적은 새로운 sed 사용자가 참조하는 것입니다.

여기에 이미지 설명을 입력하세요.

답변3

GNU sed에서: p명령은 소스 텍스트에 있는 경우에만 후행 개행을 추가하지만(패턴 공간에 배치될 때 입력에서 제거됨)반품동일한 스트림에 다른 텍스트를 인쇄하는 경우 앞에 새 줄을 추가합니다.

입력에서만 후행 줄 바꿈이 누락될 수 있습니다.마지막철사.

 $ printf 'abc' | od -An -c
    a   b   c                                 # no newline.

 $ printf 'abc' | sed '' | od -An -c
    a   b   c                                 # also no newline.

 $ printf 'abc' | sed -n 'p' | od -An -c
    a   b   c                                 # still no newline.

 $ printf 'abc' | sed -n 'p;p' | od -An -c
    a   b   c  \n   a   b   c                 # leading newline added.

새로운 줄이 생길 마지막 줄만 인쇄하세요.오직소스 파일의 마지막 줄에 이미 개행 문자가 있는 경우:

 $ printf 'abc\ndef' | sed -n '$p' | od -An -c
    d   e   f

정보 sed에서 :

----------- 각주----------

(1) 실제로 'sed'가 줄바꿈을 끝내지 않고 한 줄을 인쇄한 다음 동일한 출력 스트림으로 한 번 더 텍스트가 전송되면 여전히 누락된 줄바꿈을 인쇄합니다. 이는 "가장 예상치 못한 놀라움"을 제공합니다. "sed -np"와 같은 명령을 "cat"과 완전히 동일하게 만들지 마세요.

다른 sed 버전이 추가될 수 있습니다.뒤따라줄 바꿈 및/또는 경고를 발행합니다.

관련 정보