홀드 버퍼와 패턴 버퍼의 내용을 교환할 때 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
예약된 공간을 일부 대체할 수 있습니다.