sed 패턴 공간과 홀드 공간

sed 패턴 공간과 홀드 공간

나는 단지 이 일을 겪고 있었고 이해할 수 없었습니다.

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

관련 정보