Sobrescrevendo um arquivo de entrada

4

As soluções que encontrei para substituir o conteúdo de um arquivo de entrada por uma saída convertida envolvem o uso de um arquivo temporário ou da esponja utilitário.

Stephane Chazelas answer aqui indica uma outra maneira de abrir o arquivo no modo de leitura / gravação como abaixo.

tr ' ' '\t' < file 1<> file

Como isso realmente funciona sem corromper o arquivo em questão?

    
por iruvar 20.08.2013 / 17:30

2 respostas

6

Isso só funciona porque tr não altera o tamanho do arquivo.

1<>file abre file como saída padrão no modo sobrescrever. ( <> é chamado modo de leitura / gravação, mas como poucos programas leem stdout , é mais útil se concentrar no que realmente faz.)

Normalmente, quando você redireciona a saída ( >file ), o arquivo é aberto no modo "gravação", o que faz com que seja criado ou esvaziado. Outra opção comum é >>file , modo "anexar", que pula a etapa em que o arquivo é esvaziado, mas coloca todas as saídas no final. 1<>file também ignora o esvaziamento do arquivo, mas coloca o cursor de gravação no início do arquivo. (Você precisa do 1 porque <> usa como padrão o redirecionamento de stdin , não stdout ).

Isso é útil apenas ocasionalmente, já que muito poucas utilidades são tão precisas em sua modificação. Outro caso seria uma pesquisa e substituição, onde a substituição é exatamente o mesmo comprimento que o original. (Um substituto mais curto também não funcionaria, porque o arquivo não é truncado no final; se a saída for menor do que a original, você acabaria com o que costumava ser no final do arquivo, ainda no final. do arquivo.)

    
por 20.08.2013 / 17:44
3

Quando você usa a sintaxe < file que abre o arquivo como somente leitura e lê o conteúdo das linhas no arquivo em padrão (STDIN aka. file descriptor 0). Depois, a saída padrão (STDOUT aka. Descritor de arquivo 1) é aberta como leitura + escrita (o 1 < >) e o conteúdo das linhas é escrito dessa forma.

Você pode ler mais sobre E / S + Bash nesta seção, Capítulo 20. I / O Redirecionamento , do Guia Avançado de Script de Bash.

trecho

   [j]<>filename
      #  Open file "filename" for reading and writing,
      #+ and assign file descriptor "j" to it.
      #  If "filename" does not exist, create it.
      #  If file descriptor "j" is not specified, default to fd 0, stdin.
      #
      #  An application of this is writing at a specified place in a file. 
      echo 1234567890 > File    # Write string to "File".
      exec 3<> File             # Open "File" and assign fd 3 to it.
      read -n 4 <&3             # Read only 4 characters.
      echo -n . >&3             # Write a decimal point there.
      exec 3>&-                 # Close fd 3.
      cat File                  # ==> 1234.67890
      #  Random access, by golly.

O mesmo arquivo foi aberto várias vezes, o que?

Veja como os descritores de arquivo funcionam nesta seção Perguntas e respostas intitulado: Como o mesmo pode ser feito em diferentes processos apontar para o mesmo arquivo? . Abrange como o mesmo arquivo pode ser aberto várias vezes.

    
por 20.08.2013 / 17:44