> brew install moreutils
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring moreutils0.55.yosemite.bottle.tar.gz
🍺 /usr/local/Cellar/moreutils/0.55: 67 files, 740K
esponja lê a entrada padrão e a grava no arquivo especificado. Ao contrário de um redirecionamento de shell, a esponja absorve toda a sua entrada antes de gravar o arquivo de saída. Isso permite a construção de pipelines que leem e gravam no mesmo arquivo.
Eu não entendo Por favor me dê alguns exemplos úteis.
O que significa absorve ?
expand foo.txt | sponge foo.txt
. Veja também: stackoverflow.com/a/33639324/1959808Respostas:
Suponha que você tenha um arquivo chamado
input
, deseja remover todas as linhas iniciadas por#
ininput
. Você pode fazer com que todas as linhas não comecem#
usando:Mas como você faz alterações
input
? Com o padrão de ferramentas POSIX, você precisa usar um arquivo temporário, algo como:Com redirecionamento de shell:
truncará
input
antes de você ler.Com
sponge
, você pode:fonte
<>
operador.>
e<
,<>
não corrompe o arquivo, a menos que algo dê errado. Você pode facilmente escrever byte byte usando-o. Por exemplo, tente usá-lo comtr
.<>file
, você abre um arquivo para leitura e gravação, mas na verdade não escreve nada para arquivar.<>
não trunca um arquivo, mas apenas substitui seus bytes existentes pela nova saída. Se a nova saída for muito curta, você terá restos de lixo no final do arquivo. Mas se a nova saída for longa o suficiente, não haverá risco.A própria home page do moreutils documenta um caso de uso típico:
Aqui, o / etc / passwd está sendo gravado e lido, e está sendo modificado. Sem aplicar stdin antes de escrever, o / etc / passwd pode estar corrompido (conforme o arquivo foi alterado durante a leitura).
fonte