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

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 или использовать это в сценарии, обратитесь к моему продолжению этого принятого ответа ниже.
user12345
4
Я не знал, что кошку можно так использовать! Как писать дневник. Также не знал о том, что делает ctrl-d. Спасибо!
houallet
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>

Ссылки

Cyclonecode
источник
4
В общем, мне это нравится больше, чем принятый ответ, который использует cat, но вам лучше быть осторожным, не забудьте использовать >>вместо >!
sixty4bit
@ sixty4bit - Полностью согласен, но я думаю, вы всегда должны знать, что делаете при работе с оболочкой, иначе вы могли бы сделать что-то вроде sudo rm -r /=)
Cyclonecode
1
лучше sudo rm -r /чем sudo rm -rf /! ^ _ ^ Есть ли флаг, который запрашивал бы подтверждение перед перезаписью содержимого существующего файла с помощью >? Использование псевдонима, что всегда использовать такой флаг, было бы хорошей идеей.
sixty4bit
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
user9869932
источник
Почему в конце стоит> / dev / null?
Quadrivium
1
В >/dev/nullконце предотвращает отображение «текста» в консоли.
user9869932 08
13

Выполните принятый ответ.

Вам нужно что-то другое, кроме CTRL-D, чтобы обозначить конец, если вы используете это в скрипте . Попробуйте вместо этого:

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

Это добавит текст в указанный файл (не включая «EOF»).

Он использует здесь документ (или heredoc) .

Однако если вам нужно добавить sudo к указанному файлу, вы столкнетесь с проблемами при использовании heredoc из-за перенаправления ввода-вывода, если вы вводите текст непосредственно в командной строке.

Этот вариант будет работать, когда вы вводите текст непосредственно в командной строке:

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

Или вы можете использовать teeвместо этого, чтобы избежать проблемы sudo в командной строке, наблюдаемой при использовании heredoc с cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF
user12345
источник
Я использую много cat << 'EOF' >лет и не знал о cat << 'EOF' >>добавлении! Спасибо
FreeSoftwareServers