Як додати текст до файлу?


109

Який найпростіший спосіб додати текст до файлу в Linux?

Я переглянув це питання , але прийнята відповідь використовує додаткову програму ( sed) Я впевнений, що повинен бути простіший спосіб з echoподібним.

Відповіді:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

По суті, ви можете скинути будь-який текст, який ви хочете, у файл. CTRL-D надсилає сигнал в кінці файлу, який припиняє введення та повертає вас до оболонки.


2
Як я можу це зробити, коли файл потребує дозволу root?
UselesssCat

2
@UselesssCat, коли щось переходить у "дозвіл відхилено", я повторно перевіряю будь-яку команду, яку я виконую, а потім використовую sudo !!- яка виконує останню команду sudoзаздалегідь. Нещодавно я з'ясував, що це також працює з nanoтощо (випадково намагаючись nano nano auth...)
Сандра

якщо вам потрібно використовувати sudo або використовувати це в сценарії, зверніться до мого подальшого виконання цієї прийнятої відповіді нижче.
користувач12345

4
Я не знав, що кішку можна використовувати так! Як написання запису в журналі. Також не знав про те, що робить ctrl-d. Дякую!
гамалет

1
@Sandra - не використовував !!раніше, приголомшливо. Тому часто я роблю такі речі, як cat /var/log/apache/error.logі отримую відмову в дозволі. Це також можна зробити з ідентифікатором з історії, наприклад sudo !1419, це виконує команду в рядку 1419історії як sudo.
Cyclonecode

172

Як щодо:

echo "hello" >> <filename>

Використання >>оператора додасть дані в кінці файлу, тоді як за допомогою >перезаписує вміст файлу, якщо він вже є.

Ви також можете використовувати printfтак само:

printf "hello" >> <filename>

Зауважте, що використовувати вищезазначене може бути небезпечно. Наприклад, якщо у вас вже є файл і вам потрібно додати дані до кінця файлу, і ви забудете додати останнє, >всі дані у файлі будуть знищені. Ви можете змінити цю поведінку, встановивши noclobberзмінну у вашому .bashrc:

set -o noclobber

Тепер, коли ви спробуєте це зробити, echo "hello" > file.txtви отримаєте попереджувальну приказку cannot overwrite existing file.

Для примусового запису у файл тепер потрібно використовувати спеціальний синтаксис:

echo "hello" >| <filename>

Ви також повинні знати, що за замовчуванням echoдодається символ нового рядка, який можна придушити за допомогою -nпрапора:

echo -n "hello" >> <filename>

Список літератури


4
Взагалі мені це подобається більше, ніж прийнята відповідь, яка використовується cat, але вам краще бути обережним із використанням обов'язково >>замість цього >!
шістдесят біт

@ sixty4bit - Цілком згідний, але я думаю, що ти завжди повинен знати, що ти робиш, працюючи з оболонкою, інакше ти можеш зробити щось на кшталт sudo rm -r /=)
Cyclonecode

1
краще, sudo rm -r /ніж sudo rm -rf /! ^ _ ^ Чи є прапор, який запитав би підтвердження перед тим, як перезаписати вміст існуючого файлу >? Здається, що завжди використовувати такий прапор, здається, було б хорошою ідеєю.
шістдесят біт

2
@ sixty4bit - Ви можете додати set -o noclobberу свій .bashrcтоді ви не можете перезаписати існуючий файл без використання спеціального синтаксисуecho "hello" >| <filename>
Cyclonecode

чи можете ви навести приклад, коли файл називається, скажімо, "myFile.txt" або щось таке? Я не впевнений, чи це <ім’я_файлу> чи ім’я файлу у вашому прикладі
bharal

24

Інший можливий спосіб:

echo "text" | tee -a filename >/dev/null

Запис -aбуде додано в кінці файлу.

Якщо потрібно sudo, використовуйте:

echo "text" | sudo tee -a filename >/dev/null

Чому в кінці> / dev / null?
Quadrivium

1
В >/dev/nullкінці не дозволяється "текст" відображатися на вашій консолі.
користувач9869932

13

Слідкуйте за прийнятою відповіддю.

Вам потрібно щось, крім CTRL-D, щоб позначити кінець, якщо використовувати це в сценарії . Спробуйте це замість цього:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Це додасть текст до заявленого файлу (не включаючи "EOF").

Він використовує тут документ (або гередок) .

Однак якщо вам потрібен sudo для додавання до заявленого файлу, у вас виникнуть проблеми з використанням heredoc через перенаправлення вводу / виводу, якщо ви вводите безпосередньо в командному рядку.

Цей варіант буде працювати, коли ви вводите безпосередньо в командному рядку:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Або ви можете скористатися teeнатомість, щоб уникнути проблеми судо-командного рядка, що спостерігається під час використання heredoc з котом:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

Я користувався cat << 'EOF' >роками і не знав про те, cat << 'EOF' >>щоб додати! Спасибі
FreeSoftwareServers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.