Desde la línea de comandos, puede hacerlo:
ruby -i -pe '$_= "prepended text\n"+$_ if $. == 1' myfile
o de manera más eficiente
ruby -i -pe 'BEGIN { gets; print "prepended text\n" + $_ }; ' myfile
Por desgracia, resulta que las opciones -i
(en el lugar) no es realmente in situ, sin embargo (y tampoco es sed
s opción en el lugar para el caso) - mi archivo tendrá un inodo diferente después de la operación.
Eso me entristeció, porque efectivamente, no puedo filtrar (preceder) a un archivo enorme si no tengo suficiente espacio de disco para dos copias.
No es realmente difícil hacerlo en el lugar, sin embargo (filtrando en general, no solo para la primera línea). Todo lo que necesita hacer es:
1) asegúrese, tiene punteros de lectura y escritura separados (o objetos de archivo separados para leer y escribir) 2) asegúrese de haber almacenado las partes no leídas que va a reescribir 3) truncar al archivo al final si su operación de filtrado debe terminar con un archivo más corto
Escribí la clase de contenedor para eso en https://github.org/pjump/i_rewriter.
Con él, usted puede hacer
Rewriter.new("myfile") do |line, index|
index == 0 ? "prepended text\n" + line : line
end
o con el ejecutable:
$ i_rewriter 'index == 0 ? "prepended text\n" + line : line' myfile
Uso cuidadosamente (que puede corromper el archivo si se interrumpe).
Sea cuidadoso sorbiendo el archivo. No es una solución escalable leer un archivo completo en la memoria. –
Me gusta esto para retoques simples, personalmente. – steve
La mejor solución para el caso simple. –