1s/^$//p
imprime a primeira linha, se estiver vazia.
/./,/^$/
corresponde às linhas da primeira linha não vazia até a primeira linha vazia encontrada. Não é ganancioso no sentido de que um qualificador regex é: sed
não pode olhar para o arquivo ou voltar atrás, então ele precisa parar na primeira vez que o padrão final corresponder.
Após a linha final, a busca pela linha inicial começa novamente, então a próxima linha não vazia novamente inicia o intervalo. Na verdade, o intervalo corresponde a linhas não vazias contíguas, além do primeiro vazio seguinte.
Como o intervalo é usado como /./,/^$/!d
, todas as linhas não correspondentes são excluídas. Isso inclui a primeira linha, se estiver vazia, e é por isso que ela é impressa explicitamente pela primeira regra.
Sem a regra 1s/^$//p
, a primeira linha será removida se estiver vazia, mesmo que não seja realmente "repetida".
$ echo $'\nfoo' | sed '1s/^$//p;/./,/^$/!d'
foo
$ echo $'\nfoo' | sed '/./,/^$/!d'
foo
$
Em seu teste, o intervalo /#/,/#/
é um pouco diferente, já que começa e termina com o mesmo padrão. Line #1
corresponde ao padrão inicial (assim as linhas vazias intervenientes são impressas) Line #2
corresponde ao final (as seguintes linhas vazias não são) e em Line #3
, o intervalo começa novamente.
No outro, o padrão inicial é /#1/
, mas isso só é encontrado uma vez na entrada.