Digite o conteúdo do arquivo, canalize algumas ações e retorne o resultado

1

Existe uma maneira de fazer algo como thas:

cat somefile.txt | sort | uniq > somefile.txt

Ou seja. Eu quero listar o arquivo inteiro, em seguida, canalizar algumas ações para o seu conteúdo e, finalmente, colocar o resultado de volta ao arquivo de origem substituindo-o completamente. Por enquanto eu faço isso colocando a saída no arquivo temporário e depois de tudo movê-lo para o original. Eu quero fazer isso de maneira simples, como o Linux permite.

O shell é bash no Linux e cmd no Windows, se for importante.

    
por Alex G.P. 16.12.2014 / 16:37

2 respostas

2

(respondendo pelo bash)
Não. O shell processa os redirecionamentos primeiro, que então trunca o arquivo. Só então cat start, e está operando com um arquivo vazio.

Existe uma ferramenta chamada sponge no pacote moreutils que permite fazer isso:

cat somefile.txt | sort | uniq | sponge somefile.txt

Este comando pode ser simplificado (remover UUOC ):

sort -u somefile.txt | sponge somefile.txt

Sem sponge , você precisa gravar em um arquivo temporário e, se o comando for bem-sucedido, sobrescrever o arquivo de entrada

tmpfile=$(mktemp)
sort -u somefile.txt > "$tmpfile" && mv "$tmpfile" somefile.txt
    
por 16.12.2014 / 17:52
0

Você pode usar o Vim no modo Ex:

ex -sc 'sort u|x' somefile.txt
  1. sort u sort unique

  2. x salvar e fechar

por 11.04.2016 / 02:44