Ini sebenarnya cukup sederhana dengan sed
:jika satu baris cocok, salin saja ke h
ruang lama lalu s
mengganti nilai.
Di la$
t baris ex
ubah ruang tahan dan ruang pola lalu periksa apakah yang terakhir kosong. Jika tidak kosong, berarti pergantian sudah dilakukan jadi tidak ada hubungannya. Jika kosong, berarti tidak ditemukan kecocokan, jadi ganti spasi pola dengan variable=value yang diinginkan kemudian tambahkan ke baris saat ini di buffer penahan. Terakhir, ex
ubah lagi:
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Di atas adalah gnu sed
sintaksis. Portabel:
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile
Ini mungkin bisa dipersingkat. Ini bukan perintah sed tunggal dan juga menggunakan grep, tetapi pada dasarnya inilah yang Anda inginkan. Ini adalah satu baris, dan mengedit file di tempat (tidak ada file temp).
grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file ||
sed "$ a\FOOBAR=newvalue" -i file
Ini adalah sed
yang lebih sederhana pendekatan, karena saya tidak menemukan sed
hold space
mudah untuk bekerja dengan. Jika Anda merasa nyaman dengan hold space
, menggunakan pendekatan don_crissti memberikan peluang tambahan untuk mempertahankan apa pun dari baris yang ada, tetapi ini biasanya sangat jarang.
Dalam pendekatan ini, Anda cukup mencetak semua kecuali baris yang ingin Anda hilangkan, lalu di bagian akhir, tambahkan penggantinya.
sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile