Sou cego ou não existe uma opção --in-place
para isso sort
?
Para salvar os resultados no arquivo de entrada, sed usa -i
( --in-place
).
Redirecionando a saída sort
para o arquivo de entrada
sort < f > f
resulta em torná-lo vazio. Se não houver --in-place
opção - talvez haja algum truque para fazer isso de maneira prática ?
(A única coisa que me vem à cabeça:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Mover não é a escolha certa, pois as permissões do arquivo podem ser alteradas. É por isso que sobrescrevo o conteúdo do arquivo temporário que removo.)
text-processing
sort
Grzegorz Wierzowiecki
fonte
fonte
insitu
, permitindo que qualquer comando seja usado no local.sort
.Respostas:
sort
tem a-o, --output
opção que aceita um nome de arquivo como argumento. Se for o mesmo que o arquivo de entrada, ele grava o resultado em um arquivo temporário e substitui o arquivo de entrada original (exatamente o mesmo que o quesed -i
faz).Na
GNU sort
página de informações:e do The Open Group Base Specifications Edição 7 :
fonte
man sort
- é um recurso não documentado? É padrão e portátil?sort -o <filename> <filename>
irá classificar com segurança um arquivo no local.Você pode usar a
sponge
função, que primeiro absorvestdin
e depois a grava em um arquivo, como:A desvantagem
sponge
é que ele armazenará a saída temporariamente na memória, o que pode ser problemático para arquivos grandes. Caso contrário, você deve gravá-lo em um arquivo primeiro e depois substituir o arquivo original.Como, no entanto, é apontado por outras respostas, as modificações no local geralmente não são uma boa ideia, pois no meio de um processo (por exemplo, o processo
sponge
), a máquina pode travar e você pode perder o arquivo original e o novo. É melhor primeiro gravá-lo em um arquivo diferente e depois usar umamv
instrução atômica (mover).fonte
É perigoso substituir o arquivo de entrada pelo arquivo de saída, porque se o programa ou o sistema travar enquanto o arquivo está sendo gravado, você perdeu os dois.
Alguns programas (principalmente versões do GNU) têm uma opção no local (por exemplo,
-i
no perl e GNU sed;-o
no tipo GNU). Eles trabalham colocando os dados em um arquivo temporário e depois movendo-os para o lugar. Para programas que não têm essa opção, osponge
utilitário de Colin Watson (incluído no moreutils de Joey Hess ) realiza o trabalho com segurança em qualquer programa (exemplos: possocut
alterar um arquivo no local ?; Como faço para o iconv substituir o arquivo de entrada pelo arquivo convertido saída? ).Somente nos casos raros em que você não pode recriar o arquivo original com as mesmas permissões é recomendável substituir o arquivo no local. Nesse caso, é melhor salvar a entrada original em algum lugar. E então você pode simplesmente processar a cópia da entrada e enviá-la para o arquivo original.
fonte
sort -o
não é específico do GNU e foi especialmente desenvolvido para substituir o arquivo no local.sort
não pode começar a gravar sua saída antes de ler completamente suas entradas (usa memória ou arquivos temporários para armazenar dados); portanto, é natural que ele possa substituir sua entrada.sort
não é POSIX, poissort -mo file1 file1 file2
não é garantido que funcione enquanto ossort
s tradicionais sabem como solucionar isso (já lido no Unix V7 nos anos 70).sort -o
funciona para mim com o coreutils 8.25 e a propriedade está documentada no manual (observando que esse é apenas o caso na classificação e não na mesclagem). Se você pode reproduzir isso, envie um relatório de erro (indicando a linha de comando exata, o (s) arquivo (s) de entrada exato (s), em que sistema você o está executando e como obteve o binário).Use
-o
ou tente o vim-way:fonte