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.