Você não pode. Use ed ou GNU sed ou perl, ou faça o que eles fazem nos bastidores, que é criar um novo arquivo para o conteúdo.
ed
portátil:
ed foo <<EOF
1,$s/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/
w
q
EOF
GNU sed
:
sed -i -e 's/^\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/' foo
Perl:
perl -i -l -F, -pae 'print @F[1,3]' foo
cut
, criando um novo arquivo (recomendado, porque se o seu script for interrompido, você poderá executá-lo novamente):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
, substituindo o arquivo no lugar (mantém a propriedade e as permissões de foo
, mas precisa de proteção contra interrupções):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
Eu recomendo usar um dos cut
métodos baseados em. Dessa forma, você não depende de nenhuma ferramenta não padrão, pode usar a melhor ferramenta para o trabalho e controlar o comportamento em interrupção.
.old
método para mudanças no local,echo "$(cut -d , -f 1,3 <foo)" > foo
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
. E você não deve ligarrm foo
, porquemv foo.new foo
é atômico: remove a versão antiga e coloca a nova versão ao mesmo tempo.O pacote moreutils do ubuntu (e também do debian ) tem um programa chamado
sponge
, que também resolve o seu problema.Da esponja do homem:
O que permitiria fazer algo como:
fonte
Eu não acho que isso é possível usando
cut
sozinho. Não consegui encontrá-lo na página de informações ou homem. Você pode fazer algo comomktemp
faz de você um arquivo temporário relativamente seguro no qual você pode canalizar acut
saída.fonte
Experimente o vim-way:
Isso editará o arquivo no local (faça o backup primeiro).
Como alternativa
grep
, usesed
ougawk
.fonte
Você pode usar o slurp com o POSIX Awk:
Exemplo
fonte
Bem, como
cut
produz menos saída do que lê, você pode:Ou seja, torne o stdin
file
aberto no modo somente leitura e o stdoutfile
aberto no modo leitura + gravação sem truncamento (<>
).Dessa forma,
cut
apenas substituirá o arquivo por si próprio. No entanto, ele deixará o restante do arquivo intocado. Por exemplo, sefile
contém:A saída se tornará:
Eles
f\nb\n
foram substituídosfoo\n
, masbar
ainda estão lá. Você precisaria truncar o arquivo após acut
conclusão.Com
ksh93
, você pode fazê-lo com seu<>;
operador, que age como<>
exceto, se o comando for bem-sucedido,ftruncate()
é chamado no descritor de arquivo. Então:Com outras conchas, você precisaria fazer isso
ftruncate()
através de outros meios, como:embora invocar
perl
apenas para isso seja um pouco exagerado aqui, especialmente considerando queperl
pode facilmente fazer essecut
trabalho, como:Lembre-se de que, com todos os métodos que envolvem a reescrita no local real, se a operação for interrompida no meio do caminho, você acabará com um arquivo corrompido. O uso de um segundo arquivo temporário evita esse problema.
fonte