Привет, я хочу добавить текст в файл. Например, я хочу добавить задачи в начало файла todo.txt. Я знаю, echo 'task goes here' >> todo.txt
но это добавляет строку в конец файла (не то, что я хочу).
Привет, я хочу добавить текст в файл. Например, я хочу добавить задачи в начало файла todo.txt. Я знаю, echo 'task goes here' >> todo.txt
но это добавляет строку в конец файла (не то, что я хочу).
Ответы:
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
|
) сообщение ( echo '...'
), для cat
которого используется -
(стандартный ввод) в качестве первого файла и todo.txt
в качестве второго. cat
conCATenates несколько файлов. Отправьте вывод ( >
) в файл с именем temp
. Если нет ошибок ( &&
), cat
переименуйте ( mv
) temp
файл обратно в исходный файл ( todo.txt
).
cat
получит буквальную обратную косую черту, он не будет преобразован в новую строку. Что-то еще, должно быть, сделало это. Вместо этого cat
попробуйте подключиться, hexdump -C
чтобы увидеть, действительно ли вы отправляете обратную косую черту и n или символ новой строки. Вы также можете попытаться cat -e
показать окончание строк.
1
Средство делает следующую команду только в первой строке файла, а i
команда вставляется. Посмотрите справочную страницу в разделе «Адреса» и в разделе «Команды с нулевым или одноадресным адресом».
На мой взгляд, более простой вариант:
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
, не используйте их. Ну, кроме второго до последнего. Это не портит конец.
-e
преобразует ли также escape-последовательности внутри todo.txt?
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
.
(echo 'ble'; cat todo.txt)
:-)
Вы можете использовать Vim в режиме Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
выберите первую строку
i
вставить
x
сохранить и закрыть
Вы можете создать новый временный файл.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Вы также можете использовать sed
или awk
. Но в основном происходит то же самое.
new_todo.txt
записывается только частично. Ваше решение, похоже, потеряет исходный файл.
rm
это исходный файл.
Если текстовый файл достаточно мал, чтобы поместиться в памяти, вам не нужно создавать временный файл для его замены. Вы можете загрузить все это в память и записать обратно в файл.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Невозможно добавить строки в начало файла без перезаписи всего файла.
text=$(cat file)
, Будьте осторожны, чтобы использовать только текст, потому что переменные оболочки не являются двоичными чистыми mywiki.wooledge.org/BashFAQ/058
Вы не можете вставить содержимое в начале файла. Единственное, что вы можете сделать, это либо заменить существующий контент, либо добавить байты после текущего конца файла.
Любое решение вашего вопроса требует создания временного файла (или буфера) (в памяти или на диске), который в конечном итоге перезапишет исходный файл.
Остерегайтесь потери данных, сохраняя исходный файл при создании нового, если файловая система окажется переполненной во время процесса. например:
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'
работает, но cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
выдает ошибку "echo: нет такого файла или каталога"
<
и (
нарушает синтаксис. Попробуйтеcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Вы можете использовать tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
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]