홀드 버퍼와 모드 버퍼 사이에서 데이터를 교환할 때 sed의 x 옵션은 실제로 무엇을 합니까?

홀드 버퍼와 모드 버퍼 사이에서 데이터를 교환할 때 sed의 x 옵션은 실제로 무엇을 합니까?

홀드 버퍼와 패턴 버퍼의 내용을 교환할 때 x가 무엇을 하는지 이해가 되지 않습니다. 홀드나 패턴의 이전 데이터가 삭제되도록 홀드와 패턴 간에 데이터를 교환합니까? 결국 무슨 일이 일어났나요?

답변1

아마도 이것을 설명하는 가장 좋은 방법은 와 같은 좀 더 장황한 언어로 번역하는 것입니다 perl. 에서 sed홀드 공간은 빈 줄로 초기화된 정적 변수와 같은 반면, 패턴 공간은 sed입력의 각 줄에 차례로 할당되는 변수 입니다. . 그것은 다음과 같습니다:

$hold_space = "\n";
LINE: while ($pattern_space = <>) {

  <sed commands go here>

  print $pattern_space; # unless -n option is passed
}

x패턴을 바꾸고 공간을 유지하면 바로 그 일이 됩니다.

($pattern_space, $hold_space) = ($hold_space, $pattern_space);

이제 예약된 공간에는 패턴 공간에 포함된 내용(다른 명령으로 수정하지 않는 한 현재 입력 라인)이 포함됩니다. 그리고 패턴 공간은 보유 공간에 포함된 모든 것으로 대체되므로 출력은 다음 입력 줄이 처리되기 전에 끝에서 수행됩니다(패턴 공간은 새 입력 줄에 할당됩니다).

패턴 공간이 당신이 다루고 있는 것입니다. 따라서 그 안에 있는 데이터로 무엇이든 하려면 그 안에 있는 데이터가 필요합니다. 보관 공간은 두 줄의 입력을 처리하는 사이에 데이터를 보관해야 하는 경우 사용할 수 있는 저장 영역입니다.

g예약된 공간을 패턴 공간에 넣지만 원래 패턴 공간은 손실됩니다. x, 예약된 공간에 이전 패턴 공간을 유지합니다. 예를 들어 예약된 공간을 편집하려면 x;s/.../.../;x예약된 공간을 일부 대체할 수 있습니다.

관련 정보