Redirecionando tr stdout para um arquivo [duplicado]

1
$ cat test.txt 
This is a test file.
$ tr 'a' 'z' < test.txt 
This is z test file.
$ tr 'a' 'z' < test.txt > test.txt
$ cat test.txt
$ 

Por que o tr parece não produzir nada para o test.txt? Eu encontrei este tópico , mas eu não t realmente entender o que está acontecendo e como resolver o problema.

(Além disso, a razão pela qual eu não estou usando o sed é porque eu quero substituir as novas linhas por outro caractere, e eu não acho que o sed possa operar com base não-line-by-line?)

    
por wrongusername 20.09.2012 / 20:24

2 respostas

2

Você não pode redirecionar ambos de e para um arquivo, pelo menos não desse jeito. O problema é que quando o shell configura a parte de redirecionamento para, ele trunca o arquivo. Então, tenta ler do arquivo, está vazio.

Se a sua distro tiver um pacote moreutils , ela conterá um programa sponge para resolver esse problema: tr 'a' 'z' < test.txt | sponge test.txt funcionará.

Caso contrário, você precisa gravar sua saída em um arquivo temporário e usar mv para sobrescrever o arquivo original.

    
por 20.09.2012 / 20:34
2

O problema é que você está lendo e gravando para / do mesmo arquivo ao mesmo tempo.

Seu shell primeiro configura o redirecionamento de saída que resulta em um arquivo vazio (isto é, truncando-o). Em seguida, ele configura o redirecionamento de entrada e tr lê um arquivo vazio.

Você o corrige usando um arquivo temporário, por exemplo:

$ tr 'a' 'z' < test.txt > temp.txt && mv temp.txt test.txt
    
por 20.09.2012 / 20:30