Ajouter une ligne à un fichier seulement si elle n'existe pas déjà
j'ai besoin d'ajouter la ligne suivante à la fin d'un fichier de configuration:
include "/configs/projectname.conf"
à un fichier appelé lighttpd.conf
je cherche à utiliser sed
pour faire ceci, mais je ne peux pas trouver comment.
comment l'insérer seulement si la ligne n'existe pas déjà?
8 réponses
Juste garder les choses simples :)
grep + echo devrait suffire:
grep -q -F 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar
Edit: incorporated @ Cerin suggestion .
NOTE : pour" éditeurs " changer ma réponse: si vous avez une solution alternative donner votre propre réponse! L'édition est destinée à clarifier, formater, mieux l'anglais, et ainsi de suite! Ne changez pas la réponse des autres! (merci)
ce serait une solution propre, lisible et réutilisable utilisant grep
et echo
pour ajouter une ligne à un fichier seulement si elle n'existe pas déjà:
LINE='include "/configs/projectname.conf"'
FILE=lighttpd.conf
grep -qF -- "$LINE" "$FILE" || echo "$LINE" >> "$FILE"
Voici une sed
version:
sed -e '\|include "/configs/projectname.conf"|h; ${x;s/incl//;{g;t};a\' -e 'include "/configs/projectname.conf"' -e '}' file
si votre chaîne est dans une variable:
string='include "/configs/projectname.conf"'
sed -e "\|$string|h; ${x;s|$string||;{g;t};a\" -e "$string" -e "}" file
si vous écrivez à un fichier protégé, les réponses de @drAlberT et @rubo77 pourraient ne pas fonctionner pour vous puisqu'on ne peut pas sudo >>
. Une Solution tout aussi simple , alors, serait d'utiliser tee --append
:
LINE='include "/configs/projectname.conf"'
FILE=lighttpd.conf
grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee --append "$FILE"
utiliser awk
awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file file
une autre solution sed consiste à toujours l'ajouter à la dernière ligne et supprimer une ligne préexistante.
sed -e '$a\' -e '<your-entry>' -e "/<your-entry-properly-escaped>/d"
"correctement échappé" signifie mettre un regex qui correspond à votre entrée, c.-à-d. pour échapper à tous les contrôles regex de votre entrée actuelle, c.-à-d. pour mettre un infront antislash de ^$/*?+().
cela pourrait échouer sur la dernière ligne de votre dossier ou s'il n'y a pas de newline emmêlant, Je ne suis pas sûr, mais cela pourrait être réglé par une branche chic...
si, un jour, quelqu'un d'autre a pour traiter avec ce code comme "code d'héritage", alors cette personne sera reconnaissante si vous écrivez un code moins exotérique, comme
grep -q -F 'include "/configs/projectname.conf"' lighttpd.conf
if [ $? -ne 0 ]; then
echo 'include "/configs/projectname.conf"' >> lighttpd.conf
fi
j'ai eu besoin d'éditer un fichier avec des permissions d'écriture limitées si nécessaire sudo
. travaillant à partir de la réponse de ghostdog74 et en utilisant un fichier temp:
awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file > /tmp/file
sudo mv /tmp/file file