por que minha primeira operação de pipe não removeu o caractere de nova linha?

2

Meu nextermCensus.lis contém caracteres de nova linha e estou interessado apenas na primeira linha, gostaria de remover o caractere de nova linha. mas isso não funciona. então eu tenho que usar o segundo método para removê-lo. $(echo $census_day | tr -d '\n') funciona como eu esperava. Mas eu realmente gosto de fazer isso em uma linha.

census_day='head -1 /dr4/home/operbat/batches/nextermCensus.lis | tr -d '\n''
census_day=$(echo $census_day | tr -d '\n')
    
por dvd818 11.09.2015 / 17:27

2 respostas

2

O comando:

bla='head -1 filename'

já remove a nova linha. O comando echo anexa a nova linha novamente.

Tente:

echo "$bla\c"

(se você estiver usando um eco compatível com POSIX) e você verá que não há nova linha em $bla .

    
por 11.09.2015 / 17:44
1

Por padrão, echo adicionará uma nova linha à qualquer string ou variável que for enviada para impressão. Seu primeiro comando funciona perfeitamente, não há nova linha lá, a substituição de comando ( '...' ou seu equivalente moderno $(...) ) retira todo caractere de nova linha à direita. Só é adicionado se você tentar echo da variável.

Então, por exemplo, dado este arquivo:

$ cat foo.txt
a
b
c

Eu poderia salvar a primeira linha, excluindo a nova linha, usando apenas head :

$ census_day='head -n 1 foo.txt'

Agora, se você fosse echo , você veria uma nova linha, mas se usasse printf ou echo -n (para echo s que a suportam) você não faria isso:

$ printf %s "$census_day" | od -tc
0000000   a
0000001
    
por 11.09.2015 / 17:45