Supposons que vous ayez un file
comme ceci :
one
two
Puis pour ajouter à la première ligne :
$ sed '1 s_$_/etc/example/live/example.com/fullchain.pem;_' file
one/etc/example/live/example.com/fullchain.pem;
two
A insérer avant la première ligne :
$ sed '1 i /etc/example/live/example.com/fullchain.pem;' file
/etc/example/live/example.com/fullchain.pem;
one
two
Ou, pour ajouter après la première ligne :
$ sed '1 a /etc/example/live/example.com/fullchain.pem;' file
one
/etc/example/live/example.com/fullchain.pem;
two
Notez le numéro 1
dans ces sed
expressions - cela s'appelle l'adresse en sed
terminologie. Il vous indique sur quelle ligne la commande qui suit est à opérer.
Si votre fichier ne contient pas la ligne que vous adressez, le sed
la commande ne sera pas exécutée. C'est pourquoi vous ne pouvez pas insérer/ajouter sur la ligne 1, si votre fichier est vide.
Au lieu d'utiliser éditeur de flux , pour ajouter (pour vider les fichiers), il suffit d'utiliser une redirection shell >>
:
echo "content" >> file
Votre problème vient du fait que sed
ne peut pas localiser la ligne sur laquelle vous lui dites d'écrire, par exemple :
touch test
sed -i -e '1i/etc/example/live/example.com/fullchain.pem;\' test
tente d'écrire pour insérer à la ligne 1 de test
, mais cette ligne n'existe pas à ce stade. Si vous avez créé votre fichier en tant que :
echo -en "\n" > test
sed -i '1i/etc/example/live/example.com/fullchain.pem;\' test
il ne se plaindrait pas, mais vous auriez une ligne supplémentaire. De même, lorsque vous appelez :
sed -i "2i ssl_certificate_key /etc/example/live/example.com/privkey.pem;"
vous dites sed
pour insérer les données suivantes à la ligne 2 qui n'existent pas à ce point donc sed
ne peut pas modifier le fichier.
Ainsi, pour la ligne initiale ou la dernière ligne du fichier, vous ne devez pas utiliser sed
car simple >
et >>
les redirections de flux sont plus que suffisantes.
Votre commande fonctionnera si vous vous assurez que le fichier d'entrée comporte au moins une ligne :
[ "$(wc -l < test)" -gt 0 ] || printf '\n' >> test
sed -i -e '1 i/etc/example/live/example.com/fullchain.pem;\' test