Supponi di avere un file
come questo:
one
two
Quindi aggiungere alla prima riga:
$ sed '1 s_$_/etc/example/live/example.com/fullchain.pem;_' file
one/etc/example/live/example.com/fullchain.pem;
two
Per inserire prima della prima riga:
$ sed '1 i /etc/example/live/example.com/fullchain.pem;' file
/etc/example/live/example.com/fullchain.pem;
one
two
Oppure, per aggiungere dopo la prima riga:
$ sed '1 a /etc/example/live/example.com/fullchain.pem;' file
one
/etc/example/live/example.com/fullchain.pem;
two
Nota il numero 1
in quei sed
espressioni - si chiama l'indirizzo in sed
terminologia. Ti dice su quale linea il comando che segue è di operare.
Se il tuo file non contiene la riga che stai indirizzando, il sed
il comando non verrà eseguito. Ecco perché non puoi inserire/aggiungere alla riga 1, se il tuo file è vuoto.
Invece di utilizzare l'editor di streaming , per aggiungere (a file vuoti), basta usare un reindirizzamento della shell >>
:
echo "content" >> file
Il tuo problema deriva dal fatto che sed
non è in grado di individuare la riga in cui gli stai dicendo di scrivere, ad esempio:
touch test
sed -i -e '1i/etc/example/live/example.com/fullchain.pem;\' test
tenta di scrivere per inserire alla riga 1 di test
, ma quella linea non esiste a questo punto. Se hai creato il tuo file come:
echo -en "\n" > test
sed -i '1i/etc/example/live/example.com/fullchain.pem;\' test
non si lamenterebbe, ma avresti una linea in più. Allo stesso modo, quando chiami:
sed -i "2i ssl_certificate_key /etc/example/live/example.com/privkey.pem;"
stai dicendo sed
per inserire i seguenti dati alla riga 2 che non esiste in quel punto quindi sed
non riesce a modificare il file.
Quindi, per la riga iniziale o l'ultima riga del file, non dovresti usare sed
perché semplice >
e >>
i reindirizzamenti dello stream sono più che sufficienti.
Il tuo comando funzionerà se ti assicuri che il file di input abbia almeno una riga:
[ "$(wc -l < test)" -gt 0 ] || printf '\n' >> test
sed -i -e '1 i/etc/example/live/example.com/fullchain.pem;\' test