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

Как добавить текст в начало файла на Bash?

Привет Я хочу подготовить текст к файлу. Например, я хочу добавить задачи в начало файла todo.txt. Я знаю о echo 'task goes here' >> todo.txt, но это добавляет строку в конец файла (а не то, что я хочу).

Ответы (9)

396
396
396
2011-02-17 03:34:10 +0000
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt

или

sed -i '1s/^/task goes here\n/' todo.txt

или

sed -i '1itask goes here' todo.txt
81
81
81
2012-12-19 18:57:40 +0000

Проще, на мой взгляд :

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

Это работает, потому что команда внутри $(...) выполняется до того, как todo.txt будет перезаписана > todo.txt

. В то время как другие ответы отлично работают, я нахожу это намного проще запомнить, потому что я использую echo и cat каждый день.

EDIT: Это решение является очень плохой идеей, если есть обратные слеши в todo.txt, потому что благодаря флагу -e echo будет интерпретировать их. Другой, гораздо более простой способ вставить новые строки в предисловие - это…

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

…просто использовать новые строки. Конечно, это больше не один лайнер, но на самом деле и раньше это был не один лайнер. Если вы делаете это внутри скрипта, и беспокоитесь об отступах (например, вы выполняете это внутри функции), есть несколько обходных путей, чтобы сделать это все еще хорошо, включая, но не ограничиваясь:

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

Также, если вас беспокоит, будет ли новая строка добавлена в конец todo.txt, не используйте их. Ну, за исключением второго по счету. Это не портит конец.

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

У moreutils есть хороший инструмент под названием sponge:

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

Он “впитает” STDIN и затем запишет в файл, что означает, что вам не нужно беспокоиться о временных файлах и их перемещении.

Вы можете получить moreutils со многими дистрибутивами Linux, через apt-get install moreutils, или на операционной системе X, используя Homebrew , с brew install moreutils.

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

Вы можете использовать Vim в режиме Ex:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 выберите первую строку

  2. i вставьте

  3. x сохранить и закрыть

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

Вы можете создать новый, временный файл

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt

Вы также можете использовать sed или awk. Но в основном то же самое происходит.

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

Вы не можете вставить содержимое в начало файла. Единственное, что вы можете сделать, это заменить существующее содержимое или добавить байты после текущего конца файла.

Любое решение вашего вопроса тогда требует создания временного файла (или буфера) (в памяти или на диске), который в конечном итоге перезапишет исходный файл.

Остерегайтесь не потерять данные, сохранив исходный файл во время создания нового, если файловая система будет заполнена в течение процесса. например:

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

Если текстовый файл достаточно мал, чтобы поместиться в память, вам не нужно создавать временный файл для его замены. Вы можете загрузить все это в память и записать обратно в файл.

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

Невозможно добавить строки в начало файла без перезаписи всего файла.

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

Вы можете использовать tee:

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

GitBash + Windows10 + Multline :

Вот версия, которая позволяет использовать multi-line строки.

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