Dalla riga di comando, si può fare:
ruby -i -pe '$_= "prepended text\n"+$_ if $. == 1' myfile
o in modo più efficiente
ruby -i -pe 'BEGIN { gets; print "prepended text\n" + $_ }; ' myfile
Purtroppo, si scopre, le opzioni -i
(sul posto) non è veramente sul posto, però (e nemmeno l'opzione sed
s per quella materia) - il mio file avrà un inode diverso dopo l'op.
Questo mi ha reso triste, perché in modo efficace, non posso filtrare (anteporre a) un file enorme se non ho abbastanza spazio su disco per due copie di esso.
Non è davvero difficile farlo sul posto, però (filtraggio in generale, non solo per la prima riga). Tutto quello che dovete fare è:
1) fare in modo, di aver letto separata e scrivere puntatori (o oggetti file separato per la lettura e la scrittura) 2) assicurarsi di aver tamponato le parti non letti che si sta per riscrivere 3) troncare al file alla fine se l'operazione di filtro dovesse finire con un file più breve
Ho scritto la classe wrapper per quello https://github.org/pjump/i_rewriter.
Con esso, si può fare
Rewriter.new("myfile") do |line, index|
index == 0 ? "prepended text\n" + line : line
end
o con il file eseguibile:
$ i_rewriter 'index == 0 ? "prepended text\n" + line : line' myfile
Usare con cautela (si può corrompere il file se interrotto).
Fare attenzione a strofinare il file. Non è una soluzione scalabile per leggere un intero file in memoria. –
Mi piace questo per semplice armeggiare, personalmente. – steve
La migliore soluzione per il caso semplice. –