Isso inverte o arquivo linha por linha.
sed '1!G;h;$!d' file
Primeiro, sed
tem um espaço de espera e um espaço de padrão . Temos que distinguir entre eles antes de nos concentrarmos nesse comando específico.
Quando sed
lê uma nova linha, ela é carregada no espaço de padrão. Portanto, esse espaço é sobrescrito toda vez que uma nova linha é processada. Por outro lado, o espaço de espera é consistente durante todo o processamento e os valores podem ser armazenados lá para uso posterior.
Para o comando:
Existem três comandos nesta declaração: 1!G
, h
e $!d
-
1!G
significa que o comandoG
é executado em todas as linhas, exceto na primeira (o!
nega o1
).G
significa acrescentar o que está no espaço de armazenamento no espaço de padrões. -
h
aplica-se a todas as linhas. copia o espaço padrão para o espaço de armazenamento (e sobrescreve). -
$!d
aplica-se a todas as linhas, exceto a última ($
representa a última linha,!
nega isso).d
é o comando para excluir a linha (espaço de padrão).
- Agora, quando a primeira linha for lida,
sed
executará o comandoh
. A primeira linha é copiada para o espaço de espera. Em seguida, ele é excluído, pois corresponde à condição$!
.sed
continua com a segunda linha. - A segunda linha corresponde à condição
1!
(não é a primeira linha) e, portanto, o espaço de armazenamento (que possui a primeira linha) é anexado ao espaço de padrão (que possui a segunda linha). Depois disso, no espaço de padrão, existe agora a segunda linha seguida pela primeira linha, delimitada por uma nova linha. Agora, o comandoh
se aplica (como em todas as linhas); tudo o que está no espaço de padrão é copiado para o espaço de espera. A terceira declaração ($!d
) se aplica: A linha é excluída do espaço de padrões. - O passo 2 agora é feito com todas as linhas. Nós pulamos para a última linha.
- Na última linha (
$
), quase toda a Etapa 2 está concluída, mas não a parte de exclusão (d
).sed
, quando invocado sem-n
, imprime o espaço do padrão automaticamente no final do processamento para cada linha de entrada. Portanto, quando não excluído, o espaço do padrão é impresso. Ele contém agora todas as linhas em ordem inversa .