Привіт, я хочу додати текст до файлу. Наприклад, я хочу додати завдання до початку файлу 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]