![sed 패턴 공간과 홀드 공간](https://rvso.com/image/31634/sed%20%ED%8C%A8%ED%84%B4%20%EA%B3%B5%EA%B0%84%EA%B3%BC%20%ED%99%80%EB%93%9C%20%EA%B3%B5%EA%B0%84.png)
나는 단지 이 일을 겪고 있었고 이해할 수 없었습니다.
sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\nblub/ p }' file.
고양이 파일은 다음과 같습니다.
foo
foo
bar
1!H
나에게는 1h
패턴 공간을 덮어쓰고 1!H
쓸모가 없기 때문에 왜 존재하는가?
그러나 sed one liner는 잘 작동하는 것 같습니다.
답변1
보다@manatwork의 답변에 대한 실제 이유 때문에 1h;1!H
이식성 메모를 추가하고 싶었습니다.
표준 및 이식 가능한 구문은 다음과 같아야 합니다.
sed -n '1h; 1!H; ${ g; s/foo\nbar/bla\
blub/p;}'
sed
그렇지 않으면 전통적인 Unix 구현과 같은 대부분의 구현에서 작동하지 않습니다 .
이는 명령 \n
의 왼쪽에서 이해되지만 s
백슬래시 문자와 오른쪽의 실제 개행 문자를 사용해야 합니다. 또한 명령과 ;
사이에 이 필요하며 앞에는 공백이 없습니다 .s
}
p
홀드 공간 대신 패턴 공간에 파일 내용을 저장할 수도 있습니다.
sed -n '
:1
$!{
N;b1
}
s/foo\nbar/blah\
blup/p'
그러나 패턴과 보관 공간 모두에서 대부분 sed
의 비 GNU 구현은 크기가 제한되어 있기 때문에 작은 파일에서만 작동하는 대부분의 구현이 있습니다(그리고 POSIX에서는 8kiB의 데이터만 저장할 수 있어야 합니다).
이식 가능한 경우 다음을 사용하는 것이 좋습니다 perl
.
perl -0777 -ne 'print if s/foo\nbar/blah\nblup/'
perl
그러나 GNU 에서는 크기가 제한되지 않기 때문에 sed
프로세스별 메모리 사용량에 대해 관리상 설정된 제한이 없으면 시스템 메모리를 모두 사용하게 될 수 있으므로 시스템 성능에 영향을 미칠 수 있다는 점에 유의하세요.
답변2
1!H가 있는 이유는 나에게 1h가 패턴 공간을 덮어쓰고 1!H가 쓸모가 없기 때문입니다.
동일한 입력 라인에서 실행되지 않으므로 덮어쓰기가 발생하지 않습니다.
1h # when input line number is 1, copy pattern space to hold space
1!H # when input line number is not 1, append pattern space to hold space
이는 다음과 같은 이유로 필요합니다 info sed
.
`H'
Append a newline to the contents of the hold space, and then
append the contents of the pattern space to that of the hold space.
따라서 모든 줄을 추가하기 위해 를 사용하면 H
첫 번째 줄 앞에 추가 줄 바꿈이 있게 됩니다.
bash-4.2$ seq 3 | sed -n 'H; ${g; p;}'
1
2
3
bash-4.2$ seq 3 | sed -n '1h; 1!H; ${g; p;}'
1
2
3