Sobrescribir un file de input

Las soluciones que he encontrado para replace el contenido de un file de input con salida convertida implican el uso de un file temporal o la utilidad de esponja .

La respuesta de Stephane Chazelas aquí indica otra manera de abrir el file en modo de lectura-escritura como se muestra a continuación.

tr ' ' '\t' < file 1<> file 

¿Cómo funciona esto realmente sin corromper el file en cuestión?

Esto solo funciona porque tr no cambia el tamaño del file.

1<>file abre el file como salida estándar en modo sobrescribir. ( <> se llama modo de lectura / escritura, pero como pocos progtwigs leen stdout , es más útil enfocarse en lo que realmente hace).

Normalmente, cuando networkingirige la salida ( >file ), el file se abre en modo "escritura", lo que hace que se cree o se vacíe. Otra opción común es el modo >>file , "agregar", que omite el paso donde se vacía el file, pero pone toda la salida al final. 1<>file también omite vaciar el file, pero coloca el cursor de escritura al principio del file. (Necesita el 1 porque <> pnetworkingeterminado para networkingirigir stdin , no stdout ).

Esto solo es muy ocasionalmente útil, ya que muy pocas utilidades son tan precisas en su modificación. Otro caso sería una búsqueda y reemploop donde el reemploop es exactamente la misma longitud que el original. (Un reemploop más corto tampoco funcionaría, porque el file no se trunca al final, si el resultado es más corto que el original, terminaría con lo que solía ser al final del file que aún está al final del file.)

Cuando utiliza el < file syntax < file que abre el file como de solo lectura, y lee el contenido de las líneas en el file en estándar en (STDIN también conocido como descriptor de file 0). Después, la salida estándar (STDOUT también conocido como descriptor de file 1) se abre como lectura + escritura (el 1 <>) y el contenido de las líneas se escribe de este modo.

Puede leer más sobre I / O + Bash en esta sección, Capítulo 20. Redirección de E / S , de la Guía avanzada de Bash-Scripting.

extracto

  [j]<>filename # Open file "filename" for reading and writing, #+ and assign file descriptor "j" to it. # If "filename" does not exist, create it. # If file descriptor "j" is not specified, default to fd 0, stdin. # # An application of this is writing at a specified place in a file. echo 1234567890 > File # Write string to "File". exec 3<> File # Open "File" and assign fd 3 to it. read -n 4 <&3 # Read only 4 characters. echo -n . >&3 # Write a decimal point there. exec 3>&- # Close fd 3. cat File # ==> 1234.67890 # Random access, by golly. 

El mismo file abierto varias veces, ¿qué?

Observe cómo funcionan las descripciones de files en esta sección de preguntas y respuestas de U & L titulada: ¿Cómo puede la misma fd en diferentes processs apuntar al mismo file? . Cubre cómo se puede abrir el mismo file varias veces.