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.