Je dois ajouter la ligne suivante à la fin d'un fichier de configuration:
include "/configs/projectname.conf"
vers un fichier appelé lighttpd.conf
J'envisage d'utiliser sed
pour faire cela, mais je ne peux pas comprendre comment.
Comment pourrais-je l'insérer uniquement si la ligne n'existe pas déjà?
crudini
peut être une bonne option (mais pas encore pour lighthttpd)Réponses:
Restez simple :)
grep + echo devrait suffire:
-q
Soyez silencieux-x
correspond à toute la ligne-F
pattern est une chaîne simpleEdit: incorporé des suggestions @cerin et @ thijs-wouters .
la source
grep -vq ...
echo
pour déclencher uncat
heredoc multiligne dans un fichier de configuration.-s
pour ignorer les erreurs lorsque le fichier n'existe pas, en créant un nouveau fichier avec uniquement cette ligne.Ce serait une solution propre, lisible et réutilisable utilisant
grep
etecho
pour ajouter une ligne à un fichier uniquement si elle n'existe pas déjà:Si vous avez besoin de faire correspondre toute la ligne, utilisez
grep -xqF
Ajouter
-s
pour ignorer les erreurs lorsque le fichier n'existe pas, en créant un nouveau fichier avec uniquement cette ligne.la source
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"
-
.--
dans la commande grep, donc il n'interprétera plus un $ LINE commençant par un tiret comme des options.Voici une
sed
version:Si votre chaîne est dans une variable:
la source
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
depuis des années mais surtout juste las
commande. Les échanges d'espacehold
et d'pattern
espace me dépassent.Si vous écrivez dans un fichier protégé, les réponses de @drAlberT et @ rubo77 peuvent ne pas fonctionner pour vous car on ne peut pas sudo
>>
. Une solution tout aussi simple serait alors d'utilisertee --append
(ou, sur MacOS,tee -a
):la source
Si, un jour, quelqu'un d' autre a faire face à ce code comme « code existant », cette personne sera reconnaissant si vous écrivez un code moins exotérique, comme
la source
une autre solution sed est de toujours l'ajouter sur la dernière ligne et de supprimer une préexistante.
"correctement échappé" signifie mettre une expression régulière qui correspond à votre entrée, c'est-à-dire échapper à tous les contrôles regex de votre entrée actuelle, c'est-à-dire mettre une barre oblique inverse devant ^ $ / *? + ().
cela pourrait échouer sur la dernière ligne de votre fichier ou s'il n'y a pas de nouvelle ligne pendante, je ne suis pas sûr, mais cela pourrait être résolu par un branchement astucieux ...
la source
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
commande redémarrera le programme sed et sautera ainsi lea
ppend, si la suppression se trouvait sur la dernière ligne.a
ppend doivent être exécutés avantd
elete:sed -i -e '$a<entry>' -e '/<entry>/d'
. C'est presque la même que votre réponse initiale.utiliser awk
la source
file file
parce qu'il effectue deux passes sur le même fichier.NR==FNR
est vrai sur le premier passage, mais pas sur le second. C'est un idiome Awk courant.Les réponses utilisant grep sont fausses. Vous devez ajouter une option -x pour correspondre à la ligne entière, sinon les lignes comme celles-
#text to add
ci correspondent toujours lorsque vous cherchez à ajouter exactementtext to add
.La solution correcte est donc quelque chose comme:
la source
Utilisation de sed: il s'insérera à la fin de la ligne. Vous pouvez également transmettre des variables comme d'habitude bien sûr.
Utilisation de oneliner sed
L'utilisation de l'écho peut ne pas fonctionner sous root, mais fonctionnera comme ceci. Mais cela ne vous permettra pas d'automatiser les choses si vous cherchez à le faire, car il pourrait demander un mot de passe.
J'ai eu un problème lorsque j'essayais de modifier à partir de la racine pour un utilisateur particulier. Le simple fait d'ajouter l'
$username
avant était une solution pour moi.la source
J'avais besoin de modifier un fichier avec des autorisations d'écriture restreintes si nécessaire
sudo
. en travaillant à partir de la réponse de ghostdog74 et en utilisant un fichier temporaire:la source