sed의 P 명령은 어떻게 작동합니까?

sed의 P 명령은 어떻게 작동합니까?

sed 상태에 대한 문서

현재 패턴 공간에 첫 번째 포함된 개행 문자를 인쇄합니다.

나는 몇 가지 실험을 하고 그것을 이해하려고 노력했습니다. 아래는 내 테스트입니다.

root:[~]# seq 3 | sed -n '/2/{iline1\nline2;P}'
sed: -e expression #1, char 0: unmatched `{'
root:[~]#

여기에서는 -n패턴 공간의 자동 인쇄가 비활성화됩니다 . /2/를 포함하는 두 번째 줄과 일치합니다 2. 따라서 두 번째 줄이 일치하면 패턴 공간에 내용이 있습니다 2. 이 i명령은 line1\nline2패턴 공간의 시작 부분에 개행 문자를 삽입합니다. 따라서 패턴 공간에는 컨텐츠가 있어야 합니다 line1\nline2\n2. 지금 P주문하세요첫 번째 새 줄로 인쇄이므로 line1인쇄되어야 하며 전체 명령의 결과여야 합니다. 내 이해가 맞나요? 오류가 발생하는 이유는 무엇입니까? 미리 감사드립니다.

답변1

i명령은 패턴 공간에 아무것도 삽입하지 않습니다. 표준 출력에 텍스트를 씁니다.

더 나은 예는 다음과 같습니다.

$ cat file
line 1
line 2
line 3
line 4
$ sed -n 'N;P' file
line 1
line 3

sed스크립트는 패턴 공간으로 한 줄을 읽습니다. 이 N명령은 패턴 공간에 다음 입력 줄을 추가하고 그 사이에 개행 문자를 삽입합니다. 삽입된 개행 문자의 패턴 공간 P에 첫 번째 줄을 씁니다 . N다음 사이클이 시작됩니다(사이클이 끝나면 출력이 없기 때문입니다 -n).

답변2

오류: text 명령 뒤에 리터럴(백슬래시 없음) 개행 문자를 추가해야 합니다 i. GNU sed에서는 탈출할 수 있습니다

seq 3 | sed -n -e '/2/{iline1\nline2' -e 'P}'

\n개행 문자를 탈출한 것과 같습니다 .

그렇지 않으면:

seq 3 | sed -n '/2/{i\
line1\
line2
P;}'

귀하의 진술에 따르면 i명령은 패턴 공간이 아닌 출력 파일에 "삽입"됩니다. 수정된 예에서 패턴 공간은 2이며 P개행 문자가 포함되어 있지 않으므로 전체가 인쇄됩니다.

일반적으로 GNU sed 맨페이지는 혼란스럽고 GNU 확장만 참조할 수 있습니다. 나는 추천한다기준, 더 읽기 쉽습니다.

[1addr]i\
text
       Write text to standard output.
[2addr]P
       Write the pattern space, up to the first <newline>, to standard
       output.

관련 정보