pt - Confuso com o que cada campo faz

0

Eu sou realmente novo no UNIX (bash) e tenho tentado brincar com a linguagem. No momento, estou tentando criar uma tabela com um cabeçalho fixo de um arquivo .txt.

Então me deparei com um código que é assim:

column -t -s : <(echo Name:Age:Gender:Height:Weight) test.txt | sed "1{p;s/./*/g}"

Estou totalmente perplexo em relação às partes do comando sed no final. Eu sei que ./*/g significa que sed está substituindo todo . por * e /g significa ocorrência global.

No entanto, o que significa 1 e p;s ?

    
por pandora 12.01.2018 / 06:51

2 respostas

2

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.

    
por 12.01.2018 / 07:18
2

O script sed imprime a primeira linha de entrada e, em seguida, imprime uma linha de * caracteres com exatamente a mesma largura que a primeira linha.

1{p;s/./*/g}
  • 1 é um endereço que corresponde apenas à primeira linha de entrada. Ou seja, os comandos sed no bloco {} aplicam-se apenas à primeira linha.
  • p - imprime a entrada sem alteração
  • ; é um separador de comando, neste caso, separando o comando p e o comando s/./*/g .
  • s/./*/g - altera todos os caracteres para * e imprime o resultado.

Qualquer entrada restante (linhas 2+) é impressa sem modificações se existirem de acordo com o comportamento padrão de sed (se usado sem a opção -n )

O comando inteiro:

column -t -s : <(echo Name:Age:Gender:Height:Weight) test.txt | sed "1{p;s/./*/g}"

usa column -t -s : para tabular a entrada que consiste na string "Name:Age:Gender:Height:Weight" e no conteúdo de file.txt . A saída de column é canalizada para sed para produzir a linha de ****** s separando o cabeçalho do restante da saída.

    
por 12.01.2018 / 07:18

Tags