2011-02-17 03:21:12 +0000 2011-02-17 03:21:12 +0000
306
306

¿Cómo añado texto al principio de un archivo en Bash?

Hola quiero añadir texto a un archivo. Por ejemplo, quiero añadir tareas al principio de un archivo todo.txt. Soy consciente de echo 'task goes here' >> todo.txt pero eso añade la línea al final del archivo (no lo que yo quiero).

Respuestas (9)

396
396
396
2011-02-17 03:34:10 +0000
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
81
81
81
2012-12-19 18:57:40 +0000

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 que todo.txt se sobrescriba con > todo.txt

Mientras que las otras respuestas funcionan bien, encuentro esto mucho más fácil de recordar porque uso el eco y el gato todos los días.

EDIT: Esta solución es muy mala idea si hay barras invertidas en todo.txt, porque gracias a la bandera de -e el eco las interpretará. Otra forma mucho más fácil de introducir nuevas líneas en la cadena del prefacio es…

echo "task goes here
$(cat todo.txt)" > todo.txt

…simplemente usar nuevas líneas. Claro, ya no es una línea, pero siendo realistas, tampoco era una línea antes. Si estás haciendo esto dentro de un script, y te preocupa la sangría (por ejemplo, estás ejecutando esto dentro de una función) hay algunas soluciones para que esto todavía encaje bien, incluyendo pero no limitándose a:

(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt

Además, si te preocupa que se añada una nueva línea al final de todo.txt, no las uses. Bueno, excepto el penúltimo. Eso no afecta al final.

28
28
28
2013-04-22 12:47:19 +0000

El moreutils tiene una buena herramienta llamada sponge:

echo "task goes here" | cat - todo.txt | sponge todo.txt

“absorberá” el STDIN y luego escribirá en el archivo, lo que significa que no tienes que preocuparte por los archivos temporales y moverlos.

Puedes obtener el moreutils con muchas distribuciones de Linux, a través de apt-get install moreutils, o en OS X usando Homebrew , con brew install moreutils.

12
12
12
2016-04-11 00:23:56 +0000

Puedes usar Vim en modo Ex:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 seleccionar primera línea

  2. i insertar

  3. x guardar y cerrar

5
5
5
2011-02-17 03:26:24 +0000

Puedes 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.

3
3
3
2011-02-17 06:25:01 +0000

No puedes insertar el contenido al principio de un archivo. Lo único que puede hacer es reemplazar el contenido existente o añadir bytes después del final actual del archivo.

Cualquier solución a su pregunta requiere entonces la creación de un archivo temporal (o buffer) (en memoria o en disco) que eventualmente sobrescribirá el archivo original.

Tenga cuidado de no perder datos conservando el archivo original mientras crea el nuevo, si el sistema de archivos se llena durante el proceso. ej:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
3
3
3
2013-01-09 22:49:33 +0000

Si el archivo de texto es lo suficientemente pequeño como para caber en la memoria, no tienes que crear un archivo temporal para reemplazarlo. Puedes cargarlo todo en la memoria y volver a escribirlo en el archivo.

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

Es imposible añadir líneas al principio del archivo sin sobreescribir todo el archivo.

1
1
1
2014-07-08 14:16:36 +0000

Puedes usar tee:

echo 'task goes here' | cat - todo.txt | tee todo.txt
0
0
0
2018-08-04 07:04:48 +0000

GitBash + Windows10 + Multline :

Esta es una versión que permite usar cadenas multilínea.

##############################################
## 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]