Tu ne peux pas. Utilisez ed ou GNU sed ou perl, ou faites ce qu'ils font en arrière-plan, c'est-à-dire créer un nouveau fichier pour le contenu.
ed
portable:
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
, création d'un nouveau fichier (recommandé, car si votre script est interrompu, vous pouvez simplement le relancer):
cut -d , -f 1,3 <foo >foo.new &&
mv -f foo.new foo
cut
, en remplaçant le fichier en place (conserve la propriété et les autorisations de foo
, mais a besoin d'une protection contre les interruptions):
cp -f foo foo.old &&
cut -d , -f 1,3 <foo.old >foo &&
rm foo.old
Je recommande d'utiliser l'une des cut
méthodes basées sur. De cette façon, vous ne dépendez d'aucun outil non standard, vous pouvez utiliser le meilleur outil pour le travail et vous contrôlez le comportement en cas d'interruption.
.old
méthode pour les changements sur place,echo "$(cut -d , -f 1,3 <foo)" > foo
cut -d , -f 1,3 foo > foo.new
rm foo
mv foo.new foo
rm foo
. Et vous ne devriez pas appelerrm foo
, car ilmv foo.new foo
est atomique: il supprime l'ancienne version et met la nouvelle version en place en même temps.Le paquet moreutils d'ubuntu (et aussi de debian ) a un programme appelé
sponge
, qui résout en quelque sorte votre problème.De l'homme éponge:
Ce qui vous permettrait de faire quelque chose comme:
la source
Je ne pense pas que ce soit possible en utilisant
cut
seul. Je ne pouvais pas le trouver dans la page man ou info. Vous pouvez faire quelque chose commemktemp
fait de vous un fichier temporaire relativement sûr dans lequel vous pouvez diriger lacut
sortie.la source
Essayez vim-way:
Cela modifiera le fichier sur place (faites donc la sauvegarde en premier).
Vous pouvez également utiliser
grep
,sed
ougawk
.la source
Vous pouvez utiliser slurp avec POSIX Awk:
Exemple
la source
Eh bien, puisque
cut
produit moins de sortie qu'il n'en lit, vous pouvez faire:C'est-à-dire, rendre son stdin
file
ouvert en mode lecture seule et son stdoutfile
ouvert en mode lecture + écriture sans troncature (<>
).De cette façon,
cut
écrasera simplement le fichier sur lui-même. Cependant, cela laissera le reste du fichier intact. Par exemple, sifile
contient:La sortie deviendra:
L'
f\nb\n
ont remplacéfoo\n
, maisbar
est toujours là. Vous devez tronquer le fichier une foiscut
terminé.Avec
ksh93
, vous pouvez le faire avec son<>;
opérateur qui agit comme<>
sauf que si la commande réussit,ftruncate()
est appelée sur le descripteur de fichier. Donc:Avec d'autres obus, vous devez effectuer la
ftruncate()
via d'autres moyens comme:bien qu'invoquer
perl
juste pour cela est un peu exagéré ici, d'autant plus que celaperl
peut facilement faire cecut
travail comme:Attention, avec toutes les méthodes qui impliquent une réécriture réelle sur place, si l'opération est interrompue à mi-chemin, vous vous retrouverez avec un fichier corrompu. L'utilisation d'un deuxième fichier temporaire évite ce problème.
la source