it-swarm-ru.tech

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

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

Host localhost
    ForwardAgent yes

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

cat temp.txt >> data.txt

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

echo "hello" >> greetings.txt
346
TheLegend
# 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
604
Hauke Laging
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 является константой.

64
evilsoup
echo -e "Hello \nWorld \n" >> greetings.txt
42
kendotwill

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

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

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

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

-a - Добавляет вывод к файлам, а не перезаписывает их.

22
user206934

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-странице в ряде каталогов.

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

6
OB7DEV

Вот пример для добавления нескольких строк в файл:

{
        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
3
user2753331

Я использовал 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
Fred Mehrdad

Можно подражать 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
Sergiy Kolodyazhnyy

Еще один лайнер это:

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

Я бы предпочел -e вариант подумал, так как он дает больше контроля:

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

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

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

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

0
SJ00