Привіт, я хочу додати текст до файлу. Наприклад, я хочу додати завдання до початку файлу 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з'єднує декілька файлів. Надішліть вихід ( >) до файлу з назвою temp. Якщо немає помилок ( &&), catперейменуйте ( mv) tempфайл назад у вихідний файл ( todo.txt).
catотримає буквальний зворотний косий n, він не перетворить його на новий рядок. Щось, мабуть, зробив це. Замість цього catспробуйте ввімкнути, hexdump -Cщоб побачити, чи ви насправді надсилаєте зворотну косу риску та n чи це новий рядок. Ви також можете спробувати cat -eпоказати закінчення рядків.
1виконує наступну команду лише в рядку першого файлу і iкоманда вставляється. Подивіться на сторінку довідника в розділі «Адреси» та в розділі «Команди нульової або однієї адреси».
Більш простий варіант на мою думку:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Це працює, тому що команда всередині $(...)виконується раніше, ніж todo.txtперезаписана> todo.txt
Хоча інші відповіді спрацьовують добре, мені це набагато легше запам’ятати, оскільки я використовую ехо та кішку щодня.
EDIT: Це рішення є дуже поганою ідеєю, якщо є зворотні риски todo.txt, тому що завдяки -eпрапорці відлуння їх інтерпретуватиме. Ще один, набагато простіший спосіб ввести нові рядки в рядок передмови ...
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перетворять також послідовності втечі в 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'видає помилку "ехо: Немає такого файлу чи каталогу"
<та (перерве синтаксис. Спробуйте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]