Te sugerimos que revises esta respuesta en un ambiente controlado antes de enviarlo a producción, un saludo.
Solución:
tr ' ' 't' < file 1<> file
Reemplazaría cada carácter de espacio con un carácter de tabulación.
Solo para responder a las personas que dicen que no es seguro:
El shell abrirá el archivo para leer en el descriptor de archivo 0 y para leer y escribir en el descriptor de archivo 1. Si alguno de ellos falla, se rescatará, tr
ni siquiera será ejecutado. Si las redirecciones tienen éxito, tr
es ejecutado.
tr
leerá el archivo un bloque a la vez, hará la transliteración y generará el bloque modificado sobre el no modificado.
Al hacerlo, generalmente no necesitará asignar ningún espacio en el disco. La excepción a esto sería si el archivo fuera escaso al principio, o si los sistemas de archivos implementan la copia en escritura. Por lo tanto, no es probable que se produzcan errores de “no hay espacio disponible”.
Sin embargo, pueden ocurrir otros errores, como un error de E/S, si el disco subyacente está fallando, o si el sistema de archivos está en un dispositivo de bloque que ha sido aprovisionado de forma delgada (como una instantánea de LVM), ambas condiciones son raras y, de todos modos, probablemente impliquen traer hacer una copia de seguridad.
En todo caso, en caso de incumplimiento del write()
llamada al sistema, tr
debe informar un error y salir. Debido a que su salida estándar está abierta en modo de lectura y escritura, no ser truncado. Para que el archivo sea truncado, tr
tendría que llamar explícitamente truncate()
en su salida estándar al salir, lo que no tendría sentido.
Sin embargo, lo que sucedería sería que el archivo se transcribiría parcialmente (hasta el punto en que tr
ha fallado).
Sin embargo, lo que descubrí es que GNU tr
que se encuentra actualmente en Debian sid amd64 tiene un error en el que se produce un error de segmento cuando falla el write()
llamada al sistema y salida de basura en stdout (editar, ahora corregido desde la versión 2.19-1 del paquete libc6 Debian). Eso en realidad corrompería el archivo (pero nuevamente no lo truncaría).
tr ' ' 't' < file > newfile && mv newfile file
no reemplazaría file
a menos que el newfile
se ha creado correctamente, pero tiene una serie de problemas asociados con él:
- debe asegurarse de no aplastar una ya existente
newfile
(piense también en enlaces simbólicos) - Necesita acceso de escritura al directorio actual
- necesita espacio de almacenamiento adicional para esa copia adicional del archivo
- está perdiendo los permisos, la propiedad, la hora de nacimiento, la extensión attributes… del archivo original
- si el archivo original era un enlace simbólico, lo reemplazará con uno normal.
tr ' ' 't' < file 1<> file
es más seguro que el de uso común perl -pi -e 's/ /t/g'
porque al fallar perl
(como en el disco lleno), pierde el archivo original y solo obtiene lo que perl
ha logrado producir hasta ahora.
Puedes usar sed
también.
sed -i.bak 's/ /t/g' filename
Esto creará un filename.bak
antes de editar el archivo.
s/ /t/g
=> Esto dice sed
para sustituir un espacio con el carácter de tabulación globalmente en cada línea del archivo.
Reseñas y valoraciones del tutorial
Si te gusta este mundo, puedes dejar un enunciado acerca de qué te ha gustado de esta crónica.