Как добавить несколько строк в файл

301

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

Host localhost
    ForwardAgent yes

Так что "line then new line 'tab' then text"я думаю, что это чувствительный формат. Я знаю, что вы можете сделать это:

cat temp.txt >> data.txt

Но это кажется странным, так как его две строки. Есть ли способ добавить это в этом формате:

echo "hello" >> greetings.txt
Легенда
источник

Ответы:

527
# 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 Это называется «документ здесь». Посмотрите на этот абзац на странице руководства.
Hauke ​​Laging
1
Еще одна возможность ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ot--
2
@ ott-- Вам не нужен настоящий подоболочек (то есть, вы можете сохранить один новый процесс), этого достаточно:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging
2
В чем разница между EOT и EOL?
cikatomo
15
@cikatomo В просто случайная строка. Может быть тоже. cat <<EOTEOTcat <<FOO
Хауке Лагинг
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является постоянным.

evilsoup
источник
16

Другой подход заключается в использовании tee

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

Несколько строк выбора со teeстраницы руководства пользователя:

Утилита tee копирует стандартный ввод в стандартный вывод, делая копию в ноль или более файлов.

-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

========== РЕДАКТИРОВАТЬ == ==========

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

Я использовал приведенный выше пример, чтобы вставить конечный HTML-тег, который отсутствовал на каждой HTML-странице в нескольких каталогах.

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

OB7DEV
источник
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лучше, особенно если вы хотите всегда добавлять новую строку в файл.
Чжоуцзи
1

Я использовал sed, потому что его можно использовать с sudo. Например:

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 -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
user2753331
источник
0

В дополнение к основному ответу, если для файла требуются права суперпользователя, простое добавление sudoперед echoне будет работать.

Это связано с тем, что оболочка нарушает команды и хотя echoи запускается от имени root, но >>работает с обычными привилегиями.

Это будет работать для супер пользователя: sudo su -c "echo 'Line 3' >> greetings.txt"

SJ00
источник
Вам не нужно suздесь ( sudo suэто не хорошо). Но вы правы в том, что вам нужно что-то, что управляет перенаправлением оболочки; возможно sudo sh -c "echo stuff >> file.txt". Нет чистой экономии, но лучшая практика.
Ройма