Provavelmente, a melhor maneira de explicar isso é traduzir para uma linguagem mais detalhada como perl . Em sed , o espaço de espera é como uma variável estática que é inicializada com uma linha vazia e o espaço de padrão é uma variável que sed atribui, por sua vez, a cada linha de entrada. Algo como:
$hold_space = "\n";
LINE: while ($pattern_space = <>) {
<sed commands go here>
print $pattern_space; # unless -n option is passed
}
x troca o padrão e mantém o espaço, e apenas faz isso.
($pattern_space, $hold_space) = ($hold_space, $pattern_space);
Agora, o espaço de espera contém o que o espaço de padrão continha (a linha de entrada atual, a menos que qualquer outro comando o tenha modificado). E o espaço de padrão é substituído por qualquer espaço contido, portanto, será gerado no final antes de processar a próxima linha de entrada (onde o espaço de padrão será atribuído à nova linha de entrada).
O espaço padrão é o que você trabalha. Então você precisa dos dados lá se quiser fazer alguma coisa com isso. O espaço de armazenamento é uma área de armazenamento que pode ser usada se você precisar manter dados entre o processamento de duas linhas de entrada.
g obtém o espaço de armazenamento no espaço de padrão, mas você perde o espaço de padrão original. x , preserva o antigo espaço de padrão no espaço de armazenamento. Por exemplo, para editar o espaço de espera, você pode fazer x;s/.../.../;x para fazer alguma substituição no espaço de espera.