Мне нужно добавить следующую строку в конец файла конфигурации:
include "/configs/projectname.conf"
в файл с именем lighttpd.conf
Я пытаюсь использовать sed
это, но не могу понять, как это сделать.
Как бы я вставить его, если линия еще не существует?
crudini
может быть хорошим вариантом (но пока не для lighthttpd)Ответы:
Просто будь проще :)
grep + echo должно хватить:
-q
будь спокоен-x
соответствовать всей линии-F
шаблон представляет собой простую строкуРедактировать: включены предложения @cerin и @ thijs-wouters .
источник
grep -vq ...
echo
для запускаcat
многострочного heredoc в файл конфигурации.-s
чтобы игнорировать ошибки, когда файл не существует, создавая новый файл только с этой строкой.Это было бы чистым, читаемым и повторно используемым решением, использующим
grep
иecho
добавляющим строку в файл, только если он еще не существует:Если вам нужно соответствовать всю строку, используйте
grep -xqF
Добавьте,
-s
чтобы игнорировать ошибки, когда файл не существует, создавая новый файл только с этой строкой.источник
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"
-
.--
команду grep, чтобы она больше не интерпретировала $ LINE, начинающуюся с тире, как опции.Вот
sed
версия:Если ваша строка находится в переменной:
источник
sed -i -e '\|session.*pam_mkhomedir.so|h; ${x;s/mkhomedir//;{g;tF};a\' -e 'session\trequired\tpam_mkhomedir.so umask=0022' -e '};:F;s/.*mkhomedir.*/session\trequired\tpam_mkhomedir.so umask=0022/g;' /etc/pam.d/common-session
sed
течение многих лет, но в основном толькоs
команда. Вhold
иpattern
космические свопы за мной.Если вы пишете в защищенный файл, ответы @drAlberT и @ rubo77 могут не сработать, так как никто не может сделать sudo
>>
. Таким же простым решением было бы использоватьtee --append
(или, на MacOS,tee -a
):источник
Если однажды кому-то еще придется иметь дело с этим кодом как с «унаследованным кодом», то этот человек будет благодарен, если вы напишите менее экзотерический код, такой как
источник
Другое решение sed - всегда добавлять его в последнюю строку и удалять уже существующую.
«Правильно экранированный» означает ставить регулярное выражение, соответствующее вашей записи, т.е. экранировать все элементы управления регулярным выражением от вашей фактической записи, то есть ставить обратную косую черту перед ^ $ / *? + ().
это может произойти сбой в последней строке вашего файла или если нет висячей новой строки, я не уверен, но это может быть решено с помощью некоторого изящного ветвления ...
источник
sed -i.bak -e '$a\' -e "$NEW_IP\t\t$HOST.domain\t$HOST" -e "/.*$HOST/d" /etc/hosts
sed -i -e '/<entry>/d; $a <entry>'
d
команда перезапустит программу sed и тем самым пропуститa
ppend, если удаление произошло в последней строке.a
ppend должны быть выполнены передd
далить:sed -i -e '$a<entry>' -e '/<entry>/d'
. Это почти так же, как ваш первоначальный ответ.использовать awk
источник
file file
потому , что он делает два прохода над одним файлом.NR==FNR
верно на первом проходе, но не на втором. Это обычная идиома Awk.Ответы, использующие grep, неверны. Вам нужно добавить опцию -x, чтобы она соответствовала всей строке, в противном случае строки, как
#text to add
и раньше, будут совпадать, если вы хотите добавить точноtext to add
.Таким образом, правильное решение выглядит примерно так:
источник
Используя sed: он будет вставлен в конце строки. Вы также можете передать переменные, как обычно, конечно.
Использование oneliner sed
Использование echo может не работать под root, но будет работать так. Но это не позволит вам автоматизировать процесс, если вы захотите это сделать, поскольку он может запросить пароль.
У меня была проблема, когда я пытался редактировать из корня для конкретного пользователя. Просто добавление
$username
предыдущего было исправлением для меня.источник
Мне нужно было отредактировать файл с ограниченными правами на запись, так что нужно
sudo
. работа с ответом ghostdog74 и использование временного файла:источник