Depuis la ligne de commande, vous pouvez le faire :
ruby -i -pe '$_= "prepended text\n"+$_ if $. == 1' myfile
ou plus efficacement
ruby -i -pe 'BEGIN { gets; print "prepended text\n" + $_ }; ' myfile
Malheureusement, il s'avère que le -i
(in-place) n'est pas vraiment in-place, cependant (tout comme l'option sed
) - mon fichier aura un inode différent après l'opération.
Cela m'a rendu triste, parce qu'effectivement, je ne peux pas filtrer un énorme fichier si je n'ai pas assez d'espace disque pour en faire deux copies.
Il n'est pas vraiment difficile de le faire en place, cependant (filtrage en général, pas seulement pour la première ligne). Il suffit de faire ce qui suit :
1) Assurez-vous que vous avez des pointeurs de lecture et d'écriture séparés (ou des objets File séparés pour la lecture et l'écriture). 2) assurez-vous que vous avez mis en mémoire tampon les parties non lues que vous allez réécrire. 3) tronquez le fichier à la fin si votre opération de filtrage doit aboutir à un fichier plus court.
J'ai écrit une classe wrapper pour cela à https://github.org/pjump/i_rewriter .
Avec lui, vous pouvez faire
Rewriter.new("myfile") do |line, index|
index == 0 ? "prepended text\n" + line : line
end
ou avec l'exécutable :
$ i_rewriter 'index == 0 ? "prepended text\n" + line : line' myfile
Utilisez-le avec précaution (il peut corrompre votre fichier s'il est interrompu).