Як додати кілька рядків до файлу


301

Я пишу сценарій bash, щоб шукати файл, якщо його не існує, тоді створіть його та додайте до нього:

Host localhost
    ForwardAgent yes

Тому "line then new line 'tab' then text"я думаю, що це чутливий формат. Я знаю, що ти можеш це зробити:

cat temp.txt >> data.txt

Але це здається дивним з його двох рядків. Чи є спосіб додати це у такому форматі:

echo "hello" >> greetings.txt

Відповіді:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

Якщо для запису у файл потрібен sudo (інші привілеї користувача), скористайтеся цим:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@TheLegend Це називається "тут документ". Подивіться на цей абзац на сторінці man.
Хоуке Лагінг

1
Ще одна можливість є ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--

2
@ ott-- Вам не потрібна справжня підзарядка (тобто можна зберегти один новий процес), цього достатньо:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging

2
яка різниця між EOT та EOL?
cikatomo

15
@cikatomo In cat <<EOT- EOTце лише випадкова рядок. Може бути cat <<FOO, теж.
Hauke ​​Laging

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Або, якщо ви хочете буквальну вкладку (а не чотири пробіли у вашому запитанні):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

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



16

Інший підхід - використання tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

Кілька рядків вибору зі сторінки tee'man':

Утиліта трійника копіює стандартний вхід на стандартний вихід, роблячи копію в нульовий або більше файли.

-a - Додайте вихід до файлів, а не перезаписуючи їх.


6

SED може додати рядок до кінця файлу так:

sed -i '$ a text to be inserted' fileName.file
$вибирає кінець файлу, aповідомляє йому додавати, а після цього надходить текст, який потрібно вставити. Тоді звичайно назва файлу.


Джерело: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html

========== EDIT == ==========

Чи має цей підхід додаткові переваги, ніж інші рішення?
Так, цей підхід має додаткову перевагу додавання до будь-яких файлів, що повертаються в пошуку, наприклад цього: find . -name "*.html" -exec sed -i '$ a </html>' {} \;

Я використав вищенаведений приклад, щоб вставити закінчуючий html-тег, який відсутній на кожній html-сторінці в ряді каталогів.

=====================================


1
Якщо ви показали б синтаксис для додавання декількох рядків до файлу, то це буде відповіддю на запитання (хоча і не дуже корисне). Всі інші відповіді просто напишіть новий текст. Ця відповідь читає весь файл і переписує його, а також доданий текст. Чи має такий підхід користь перед іншими?
G-Man

Це працює лише з GNU sed. BSD sedвивалюється з помилкою: command a expects \ followed by text. Тому не використовуйте це для сценарію рішення; це може зламатися. (Або зробіть це належним чином, оскільки потрібний синтаксис BSD сумісний з POSIX і він працюватиме і в GNU sed.
Wildcard

Решта відповідей можуть бути використані findнаступним чином : find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man

1
Це дуже хороше рішення, оскільки воно не робить перенаправлення потоку ( >, >>) і, отже, не страждає від таких проблем, як біг sudo echo 'something' > /file. Для мене це цілком дозволяє додати рядок в файл в LXD контейнері , як , що: lxc exec c sed -- '$ a newline' /myfile.
Драко Атер

echo "a new line" >> foo.fileЧи не буде створювати новий рядок , якщо файл не закінчується нова лінія, але sed -i '$ a a new line' foo.fileбуде робити, тому sedкраще особливо ви хочете завжди додати новий рядок в файл.
zhouji

1

Я використовував sed, оскільки його можна використовувати із судо. Наприклад:

sudo sed -i '$ a text to be inserted' fileName.file 

альтернатива дуже потворна, як:

sudo bash -c "echo a text to be inserted >> fileName.file"  

і навіть гірше, коли закінчується з ssh.


1
Чому ця відповідь була спростована? Це виглядає як потрібне мені рішення. Чи є з цим проблеми? Якщо ні, я скористаюсь цим і відхилю його.
MountainX

Ви sed -iне приймаєте розширення як аргумент? Ваш приклад може мати неправильні параметри.
протомета

1

Ще один лайнер:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Я вважаю за краще -eваріант варіанту, оскільки він дає більше контролю:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

1

Можна cat >> out.txtдосягти ефекту з Perl або Python, щоб досягти однакового ефекту. Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

І Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Зауважте, що для python вам доведеться натиснути Ctrl+ Dдвічі. Див. Пов’язане запитання про stackoverflow для отримання додаткової інформації.


1

Ось приклад додавання декількох рядків у файл:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

На додаток до основної відповіді, якщо файл потребує дозволів супер користувача, просто додавання sudoперед ним echoне спрацює.

Це тому, що оболонка розбиває команди і хоч echoі запускається як root, але працює >>з нормальними привілеями.

Це буде працювати для суперкористувача: sudo su -c "echo 'Line 3' >> greetings.txt"


Тут вам не потрібно su( sudo suце не добре). Але ви маєте рацію в тому, що вам потрібно щось зробити, щоб керувати перенаправленням оболонки; можливо sudo sh -c "echo stuff >> file.txt". Ніякої чистої економії, а кращої практики.
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.