Saya perlu menambahkan baris berikut ke akhir file konfigurasi:
include "/configs/projectname.conf"
ke file yang disebut lighttpd.conf
Saya melihat kegunaan sed
untuk melakukan ini, tetapi saya tidak tahu caranya.
Bagaimana saya hanya memasukkannya jika salurannya belum ada?
crudini
mungkin merupakan opsi yang baik (tetapi belum untuk lighthttpd)Jawaban:
Sederhana saja :)
grep + echo sudah cukup:
-q
diam-x
cocok dengan seluruh baris-F
polanya adalah string biasaEdit: memasukkan @cerin dan saran @ thijs-wouters .
sumber
grep -vq ...
echo
untuk memicucat
heredoc multiline ke file konfigurasi.-s
untuk mengabaikan kesalahan ketika file tidak ada, membuat file baru hanya dengan baris itu.Ini akan menjadi solusi yang bersih, mudah dibaca dan dapat digunakan kembali menggunakan
grep
danecho
menambahkan baris ke file hanya jika belum ada:Jika Anda harus mencocokkan penggunaan seluruh baris
grep -xqF
Tambah
-s
untuk mengabaikan kesalahan ketika file tidak ada, membuat file baru hanya dengan baris itu.sumber
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"
-
.--
dalam perintah grep, jadi itu tidak akan menafsirkan $ LINE dimulai dengan tanda hubung sebagai opsi lagi.Ini sebuah
sed
versi:Jika string Anda dalam variabel:
sumber
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
selama bertahun-tahun tetapi kebanyakan hanyas
perintah. Thehold
danpattern
swap space yang di luar saya.Jika menulis ke file yang dilindungi, jawaban @drAlberT dan @ rubo77 mungkin tidak berfungsi untuk Anda karena orang tidak dapat melakukan sudo
>>
. Sebuah solusi sama sederhana , maka, akan menggunakantee --append
(atau, pada MacOS,tee -a
):sumber
Jika, suatu hari, orang lain harus berurusan dengan kode ini sebagai "kode warisan", maka orang itu akan berterima kasih jika Anda menulis kode yang kurang eksoteris, seperti
sumber
solusi sed lain adalah untuk selalu menambahkannya di baris terakhir dan menghapus yang sudah ada sebelumnya.
"lolos dengan benar" berarti menempatkan regex yang cocok dengan entri Anda, yaitu untuk menghindari semua kontrol regex dari entri Anda yang sebenarnya, yaitu untuk meletakkan backslash di depan ^ $ / *? + ().
ini mungkin gagal pada baris terakhir file Anda atau jika tidak ada baris baru yang menggantung, saya tidak yakin, tapi itu bisa ditangani oleh beberapa percabangan yang bagus ...
sumber
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
perintah akan me-restart program sed dan dengan demikian melewatkana
ppend, jika penghapusan kebetulan berada di baris terakhir.a
ppend harus dilaksanakan sebelumd
apus:sed -i -e '$a<entry>' -e '/<entry>/d'
. Itu hampir sama dengan jawaban awal Anda.gunakan awk
sumber
file file
karena membuat dua melewati file yang sama.NR==FNR
benar pada pass pertama, tetapi tidak pada pass kedua. Ini adalah ungkapan awk yang umum.Jawaban menggunakan grep salah. Anda perlu menambahkan opsi -x untuk mencocokkan seluruh baris jika tidak, baris seperti
#text to add
masih akan cocok ketika ingin menambahkan dengan tepattext to add
.Jadi solusi yang benar adalah sesuatu seperti:
sumber
Menggunakan sed: Ini akan menyisipkan di akhir baris. Anda juga dapat mengirimkan variabel seperti biasa.
Menggunakan oneliner sed
Menggunakan gema mungkin tidak berfungsi di bawah root, tetapi akan berfungsi seperti ini. Tapi itu tidak akan membiarkan Anda mengotomatiskan hal-hal jika Anda ingin melakukannya karena mungkin meminta kata sandi.
Saya punya masalah ketika saya mencoba mengedit dari root untuk pengguna tertentu. Hanya menambahkan
$username
sebelumnya adalah perbaikan untuk saya.sumber
Saya perlu mengedit file dengan izin tulis terbatas sehingga diperlukan
sudo
. bekerja dari jawaban ghostdog74 dan menggunakan file temp:sumber