Hola, quiero anteponer texto a un archivo. Por ejemplo, quiero agregar tareas al comienzo de un archivo todo.txt. Soy consciente, echo 'task goes here' >> todo.txt
pero eso agrega la línea al final del archivo (no es lo que quiero).
285
Respuestas:
o
o
fuente
|
) el mensaje (echo '...'
)cat
que utiliza-
(entrada estándar) como primer archivo ytodo.txt
como segundo.cat
Concatena múltiples archivos. Envíe la salida (>
) a un archivo llamadotemp
. Si no hay errores (&&
) desdecat
entonces, cambie el nombre (mv
) deltemp
archivo al archivo original (todo.txt
).cat
recibe una barra invertida literal n, no la convertirá en una nueva línea. Algo más debe haber hecho eso. En lugar decat
, intentehexdump -C
ver si realmente está enviando una barra invertida y no si es una nueva línea. También puede intentarcat -e
mostrar los finales de línea.1
medios hacen el siguiente comando solo en la línea uno del archivo y eli
comando es insertar. Mire en la página del manual debajo de la sección "Direcciones" y en la sección "Comandos de cero o una dirección".Una opción más simple en mi opinión es:
Esto funciona porque el comando dentro de
$(...)
se ejecuta antes detodo.txt
sobrescribirse con> todo.txt
Si bien las otras respuestas funcionan bien, encuentro que esto es mucho más fácil de recordar porque uso echo y cat todos los días.
EDITAR: Esta solución es una muy mala idea si hay barras invertidas
todo.txt
, porque gracias a la-e
bandera echo las interpretará. Otra forma mucho más fácil de obtener nuevas líneas en la cadena de prefacio es ...... simplemente para usar nuevas líneas. Claro, ya no es una sola línea, pero de manera realista tampoco era una sola línea antes. Si está haciendo esto dentro de un script y le preocupa la sangría (p. Ej., Está ejecutando esto dentro de una función), existen algunas soluciones alternativas para que esto se ajuste bien, incluidos, entre otros:
Además, si le importa si se agrega una nueva línea al final de
todo.txt
, no los use. Bueno, excepto el penúltimo. Eso no se mete con el final.fuente
-e
convertirá también las secuencias de escape dentro de todo.txt?El
moreutils
tener una buena herramienta llamadasponge
:"Absorberá" STDIN y luego escribirá en el archivo, lo que significa que no tiene que preocuparse por los archivos temporales y moverlos.
Puede obtener
moreutils
muchas distribuciones de Linux, a travésapt-get install moreutils
o en OS X usando Homebrew , conbrew install moreutils
.fuente
(echo 'ble'; cat todo.txt)
:-)Puede usar Vim en modo Ex:
1
seleccione primera líneai
insertarx
guardar y cerrarfuente
Puede crear un nuevo archivo temporal.
También puedes usar
sed
oawk
. Pero básicamente sucede lo mismo.fuente
new_todo.txt
se escriba solo parcialmente. Su solución parece perder el archivo original.rm
del archivo original.Si el archivo de texto es lo suficientemente pequeño como para caber en la memoria, no tiene que crear un archivo temporal para reemplazarlo. Puede cargarlo todo en la memoria y volver a escribirlo en el archivo.
Es imposible agregar líneas al comienzo del archivo sin sobreescribir todo el archivo.
fuente
text=$(cat file)
. Sin embargo, tenga cuidado de usar solo texto, porque las variables de shell no son binarias. Mywiki.wooledge.org/BashFAQ/058No puede insertar contenido al comienzo de un archivo. Lo único que puede hacer es reemplazar el contenido existente o agregar bytes después del final actual del archivo.
Cualquier solución a su pregunta requiere que se cree un archivo temporal (o búfer) (en la memoria o en el disco) que eventualmente sobrescribirá el archivo original.
Tenga cuidado de no perder datos conservando el archivo original mientras crea el nuevo, en caso de que el sistema de archivos esté lleno durante el proceso. p.ej:
fuente
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
funciona perocat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
da el error "echo: No<
y el(
rompería la sintaxis. Pruebacat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Puedes usar
tee
:fuente
GitBash + Windows10 + Multline :
Aquí hay una versión que le permite usar cadenas de varias líneas .
fuente