251

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

9 ответов9

335
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
62

На мой взгляд, более простой вариант:

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

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

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

РЕДАКТИРОВАТЬ: Это решение является очень плохой идеей, если в 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

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

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

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

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

6

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

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

  2. i вставляю

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

5

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

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

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

3

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

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

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

2

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

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

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

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
0

GitBash + Windows10 + Multline:

Вот версия, которая позволяет вам использовать многострочные строки.

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

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

echo 'task goes here' | cat - todo.txt | tee todo.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .