¿Estoy ciego o no hay ninguna opción al igual que --in-place
para sort
?
Para guardar los resultados en el archivo de entrada, sed usa -i
( --in-place
).
Redirigir la salida de sort
al archivo de entrada
sort < f > f
resulta en hacerlo vacío. Si no hay --in-place
opción, ¿tal vez hay algún truco para hacerlo de manera práctica ?
(Lo único que me viene a la mente:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Mudarse no es la elección correcta, ya que los permisos de los archivos pueden cambiar. Es por eso que sobrescribo con el contenido del archivo temporal que luego elimino).
text-processing
sort
Grzegorz Wierzowiecki
fuente
fuente
insitu
, permitiendo que cualquier comando se use en el lugar.sort
.Respuestas:
sort
tiene la-o, --output
opción que toma un nombre de archivo como argumento. Si es el mismo que el archivo de entrada, escribe el resultado en un archivo temporal, luego sobrescribe el archivo de entrada original (exactamente lo mismo que lo quesed -i
hace).Desde la
GNU sort
página de información:y de The Open Group Base Especificaciones Número 7 :
fuente
man sort
¿es una función no documentada? ¿Es estándar y portátil?sort -o <filename> <filename>
ordenará de forma segura un archivo en su lugar.Puede usar la
sponge
función, que primero empapastdin
y luego la escribe en un archivo, como:La desventaja
sponge
es que almacenará la salida temporal en la memoria, lo que puede ser problemático para archivos grandes. De lo contrario, primero debe escribirlo en un archivo y luego sobrescribir el archivo original.Sin embargo, como señalan otras respuestas, las modificaciones en el lugar en general no son una buena idea, ya que en medio de un proceso (por ejemplo, el
sponge
uno), la máquina puede fallar y luego puede perder tanto el archivo original como el nuevo. Es mejor que primero lo escriba en un archivo diferente y luego use unamv
instrucción atómica (mover).fuente
Es peligroso sobrescribir el archivo de entrada con el archivo de salida, porque si el programa o el sistema se bloquea mientras se está escribiendo el archivo, ha perdido ambos.
Algunos programas (en su mayoría versiones de GNU) tienen una opción in situ (por ejemplo,
-i
en perl y GNU sed;-o
en GNU sort). Funcionan colocando los datos en un archivo temporal y luego moviéndolos a su lugar. Para los programas que no tienen esa opción, de Colin Watsonsponge
utilidad (incluido en moreutils de Joey Hess ) hace el trabajo de manera segura para cualquier programa (ejemplos: ¿Puedo hacercut
? Cambiar un archivo en su lugar ; ¿Cómo puedo hacer iconv reemplazar el archivo de entrada con el convertida salida? ).Solo en esos raros casos en los que no puede volver a crear el archivo original con los mismos permisos, recomiendo sobrescribir el archivo en su lugar. En este caso, será mejor que guarde la entrada original en alguna parte. Y luego simplemente puede procesar la copia de la entrada y enviarla al archivo original.
fuente
sort -o
no es específico de GNU, y está especialmente diseñado para modificar el archivo en su lugar.sort
no puede comenzar a escribir su salida antes de que haya leído completamente sus entradas (usa memoria o archivos temporales para almacenar datos), por lo que es bastante natural que pueda anular su entrada.sort
no es POSIX, yasort -mo file1 file1 file2
que no se garantiza que funcione, mientras que los tradicionalessort
saben cómo solucionarlo (ya en Unix V7 en los años 70).sort -o
funciona para mí con coreutils 8.25 y la propiedad está documentada en el manual (teniendo en cuenta que solo es el caso al ordenar, no al fusionar). Si puede reproducir esto, envíe un informe de error (indicando la línea de comando exacta, los archivos de entrada exactos, en qué sistema lo está ejecutando y cómo obtuvo el binario).Usa
-o
o prueba el vim-way:fuente