Usando o comando tr

0

Suponha que o arquivo ft tenha 25 linhas de texto. Explique o comando:

tail -15 ft | tr "a" "A" > ft

e diga-me quantas linhas o arquivo ft tem após a execução do comando.

Entendo que tail -15 ft irá capturar as últimas 15 linhas do arquivo ft e que tr 'a' 'A' alterará qualquer a para A .

Mas não entendo por que > tr exclui tudo do arquivo.

    
por UNIX newb 09.03.2016 / 15:24

3 respostas

1

O que acontece é que, em primeiro lugar, o shell configura redirecionamentos (neste caso, > ft ), e isso trunca ft e o abre para gravação; em seguida, configura o restante do pipeline. tail -15 ft obtém um arquivo vazio e fornece um resultado vazio, que tr manipula para substituir nada. ft é um arquivo vazio como resultado.

    
por 09.03.2016 / 15:56
1

Você está usando um redirecionamento de saída padrão e não < a href="https://www.gnu.org/software/bash/manual/bashref.html#Appending-Redirected-Output"> anexando saída redirecionada Se você está tentando anexar a saída para o seu arquivo original, o que eu não penso assim .

De man bash

Redirecting Output If the file does not exist it is created; if it does exist it is truncated to zero size.

Appending Redirected Output Redirection of output in this fashion causes the file whose name results from the expansion of word to be opened for appending on file descriptor n, or the standard output (file descrip‐ tor 1) if n is not specified. If the file does not exist it is created.

Então, como você está especificando para redirecionar a saída para o mesmo arquivo, isso será truncado e criado com a saída esperada

O que sugiro fazer é usar sed com o redirection

$ tail -15 ft | sed -e 's|a|A|g' > sed_output
    
por 09.03.2016 / 15:36
-1

Você não está usando a notação correta do bash.

No bash, você precisa usar '> file' para sobrescrever um arquivo e '> > file' para anexá-lo. Em vez disso, use "> > ft".

    
por 09.03.2016 / 15:59