> brew install moreutils
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring moreutils0.55.yosemite.bottle.tar.gz
🍺 /usr/local/Cellar/moreutils/0.55: 67 files, 740K
la esponja lee la entrada estándar y la escribe en el archivo especificado. A diferencia de un redireccionamiento de shell, la esponja absorbe toda su entrada antes de escribir el archivo de salida. Esto permite construir tuberías que leen y escriben en el mismo archivo.
No entiendo. Por favor, dame algunos ejemplos útiles.
¿Qué significa absorber ?
expand foo.txt | sponge foo.txt
. Ver también: stackoverflow.com/a/33639324/1959808sponge
"absorbe" su entrada antes de truncar el archivo de salidaRespuestas:
Suponga que tiene un archivo llamado
input
, desea eliminar todas las líneas que comienzan con#
ininput
. Puede obtener que todas las líneas no comiencen con#
:Pero, ¿cómo haces cambios
input
? Con el estándar POSIX toolchest, necesita usar un archivo temporal, algo como:Con redireccionamiento de shell:
se truncará
input
antes de leerlo.Con
sponge
usted puede:fuente
<>
operador.>
y<
,<>
no corrompe el archivo a menos que algo salga realmente mal. Puedes escribir byte por byte con bastante facilidad. Por ejemplo, intente usarlo contr
.<>file
, abres un archivo para leer y escribir, pero en realidad no escribes nada en el archivo.<>
no trunca un archivo, sino que simplemente reemplaza sus bytes existentes con la nueva salida. Si la nueva salida es demasiado corta, tendrá restos de basura al final del archivo. Pero si la nueva salida es lo suficientemente larga, no hay riesgo.La propia página de inicio de moreutils documenta un caso de uso típico:
Aquí, / etc / passwd está siendo escrito y leído, y está siendo modificado. Sin usar el stdin antes de escribir, / etc / passwd podría estar dañado (ya que el archivo cambió durante la lectura).
fuente