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).
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).
Respuestas:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
o
sed -i '1s/^/task goes here\n/' todo.txt
o
sed -i '1itask goes here' todo.txt
|
) el mensaje ( echo '...'
) cat
que utiliza -
(entrada estándar) como primer archivo y todo.txt
como segundo. cat
Concatena múltiples archivos. Envíe la salida ( >
) a un archivo llamado temp
. Si no hay errores ( &&
) desde cat
entonces, cambie el nombre ( mv
) del temp
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 de cat
, intente hexdump -C
ver si realmente está enviando una barra invertida y no si es una nueva línea. También puede intentar cat -e
mostrar los finales de línea.
1
medios hacen el siguiente comando solo en la línea uno del archivo y el i
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:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Esto funciona porque el comando dentro de $(...)
se ejecuta antes de todo.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 ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... 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:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
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.
-e
convertirá también las secuencias de escape dentro de todo.txt?
El moreutils
tener una buena herramienta llamada sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
"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és apt-get install moreutils
o en OS X usando Homebrew , con brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
Puede usar Vim en modo Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
seleccione primera línea
i
insertar
x
guardar y cerrar
Puede crear un nuevo archivo temporal.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
También puedes usar sed
o awk
. Pero básicamente sucede lo mismo.
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.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Es imposible agregar líneas al comienzo del archivo sin sobreescribir todo el archivo.
text=$(cat file)
. Sin embargo, tenga cuidado de usar solo texto, porque las variables de shell no son binarias. Mywiki.wooledge.org/BashFAQ/058
No 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:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
funciona pero cat <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
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
Aquí hay una versión que le permite usar cadenas de varias líneas .
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]