Como sobrescrever com um pipe no unix

1

Por isso, estou tentando substituir usando um canal:

    //reads contents of file| turns lowercase to uppercase | changes $ to # |
    // then attempts to overwrite original file with new version
    cat cutTester.txt|tr '[a-z]' '[A-Z]'|tr '$' '#' >cutTester.txt

mas quando eu faço isso, simplesmente apaga o arquivo. Este é o conteúdo do arquivo

    $first$second$third$fourth
    $fifth$sixth$seventh$eighth
    $ninth$tenth$eleventh$twelveth
    $thirteenth$fourthteenth$fifthteenth$sixthteenth
    $seventeenth$eightteenth$nineteenth$twenty
    $twenty-one$twenty-two$twenty-three$twenty-four
    
por bordenE 15.04.2017 / 04:09

1 resposta

0

O que está acontecendo é que você está truncar cutTester.txt usando a notação de redirecionamento " > ". Você está processando seus comandos tr na saída redirecionada de um arquivo de entrada vazio.

Observe que o seguinte também trunca o arquivo:

$ cat cutTester.txt > cutTester.txt

Particularmente, se você for um desenvolvedor, pode estar acostumado a escrever declarações como x='eval $x + 1' , nas quais a expressão eval é avaliada antes da atribuição. O comportamento dos operadores de redirecionamento não é análogo, no entanto. Considere que a implementação de redirecionar a saída de um arquivo de volta para si exigiria que o shell criasse arquivos temporários nos bastidores e não seria uma operação tão direta ou eficiente quanto simplesmente reatribuir uma variável (que existe apenas na memória). / p>

Felizmente, é bastante simples criar explicitamente um arquivo temporário:

#!/bin/bash

# reads contents of file| turns lowercase to uppercase | changes $ to # |
# then attempts to override original file with new version

cat cutTester.txt | tr '[a-z]' '[A-Z]' | tr '$' '#' > cutTester.tmp; mv cutTester.tmp cutTester.txt
    
por 23.04.2017 / 00:20