Esse é um código razoavelmente inteligente.
Sed, como você pode aprender em um bom tutorial , funciona em endereços e comandos. Se o endereço for omitido, o comando será executado em todas as linhas, como o comumente visto s/old/new/
.
Um endereço pode ser um número de linha ou uma expressão regular. Ou pode ser um intervalo de endereços separados por vírgula, que não descreverei mais. (Veja tutorial ligado acima para mais detalhes.)
Um comando pode ser um único comando ou vários comandos contidos em chaves.
Esse comando sed executa o comando p
rint e, em seguida, o comando s
ubstitute na linha 1 da entrada. O resultado é que, após a primeira linha de entrada, uma sequência de ***
terá o mesmo tamanho.
Você pode notar que o comando s
não tem nenhum comando p
rint após ele, mas no final de cada linha, o que quer que seja mantido no "espaço padrão" é implicitamente impresso, a menos que -n
opção foi passada para sed em primeiro lugar. (Novamente, veja o tutorial acima para mais.)
Essencialmente, é uma maneira rápida de criar um cabeçalho bonito para a mesa.
Editar para responder ao comentário:
So the
p
command can be placed anywhere either at the start of the 1sedor at the end? Also, the
.' (period) means that the address is omitted?
Não, não é bem assim.
O 1
significa, aplique a seguinte lista de comandos (entre chaves) somente na primeira linha de entrada.
O p
significa, imprima o conteúdo atual do espaço de padrão, seguido por uma nova linha. (O espaço padrão, nesse momento, contém a primeira linha de entrada, pois é assim que Sed funciona.)
O s/./*/g
significa que, para CADA correspondência ( g
lobally) do regex .
(que corresponde a qualquer caractere), substitua o caractere *
. Isso opera no espaço padrão.
Em seguida, no final dos comandos (a chave de fechamento), já que não há mais comandos, o conteúdo do espaço de padrão é implicitamente impresso. Neste ponto, ele conterá apenas um monte de asteriscos ( ***
).
Em seguida, a próxima linha de entrada é lida no espaço padrão. Como o endereço 1
não corresponde, o bloco de chaves é ignorado. No final do bloco de chaves, como não há mais comandos, o conteúdo do espaço de padrão é implicitamente impresso. Repita este parágrafo enquanto houver entrada. Portanto, o resultado é que o restante da entrada após a primeira linha é impresso sem alteração.
Assim, a saída conterá todas as linhas da entrada, MAIS uma linha depois da primeira linha, que consistirá apenas em *
caracteres e qual será o mesmo comprimento que a primeira linha.