72 votes

Linux : Comment utiliser un fichier comme entrée et sortie en même temps ?

Je viens d'exécuter ce qui suit en bash :

uniq .bash_history > .bash_history

et mon fichier historique s'est retrouvé complètement vide.

Je suppose que j'ai besoin d'un moyen de lire l'ensemble du fichier avant d'y écrire. Comment faire ?

PS : J'ai évidemment pensé à utiliser un fichier temporaire, mais je cherche une solution plus élégante.

3voto

Kyle Brandt Points 81077

Il est intéressant de noter que sed utilise également un fichier temporaire (ceci le fait juste pour vous) :

$ strace sed -i 's/foo/bar/g' foo    
open("foo", O_RDONLY|O_LARGEFILE)       = 3
...
open("./sedPmPv9z", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
...
read(3, "foo\n"..., 4096)               = 4
write(4, "bar\n"..., 4)                 = 4
read(3, ""..., 4096)                    = 0
close(3)                                = 0
close(4)                                = 0
rename("./sedPmPv9z", "foo")            = 0
close(1)                                = 0
close(2)                                = 0

Description :
Le fichier temporaire ./sedPmPv9z devient fd 4, et le foo devient fd 3. Les opérations de lecture se font sur fd 3, et les écritures sur fd 4 (le fichier temporaire). Le fichier foo est alors écrasé par le fichier temporaire dans l'appel rename.

2voto

jason saldo Points 5036

Ce site sed script supprime les doublons adjacents. Avec le -i il effectue la modification sur place. Il s'agit de l'option sed info fichier :

sed -i 'h;:b;$b;N;/^\(.*\)\n\1$/ {g;bb};$b;P;D' .bash_history

1voto

Antonio Lebrón Points 11

Une autre solution :

uniq file 1<> líneas.txt

0voto

Paul Wicks Points 13205

Un fichier temporaire est à peu près tout, à moins que la commande en question ne prenne en charge l'édition en place ( uniq ne le fait pas - certains sed s font ( sed -i )).

0voto

Zombo Points 1119

Vous pouvez utiliser Vim en mode Ex :

ex -sc '%!uniq' -cx .bash_history
  1. % sélectionner toutes les lignes

  2. ! exécuter la commande

  3. x sauvegarder et fermer

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X