Dengan file input tunggal yang hanya berisi komentar (dimulai dengan #) dan VARIABEL = baris nilai, apakah mungkin untuk mengganti nilai untuk variabel tunggal jika ditemukan dan, jika tidak, menambahkan pasangan ke akhir file jika tidak ditemukan?
Metode saya saat ini bekerja dengan menghapusnya di pass pertama, lalu menambahkannya ke akhir file di pass kedua, tetapi metode ini mengacaukan urutan baris (dan juga dua perintah berbeda):
sed -r "/^FOOBAR=.*$/d" -i samefile &&
sed -r "$ a\FOOBAR=newvalue" -i samefile
Apakah ada cara untuk melakukan ini, yaitu. menjaga urutan garis, dalam satu baris sed? Jika beberapa utilitas lain (awk, ...) melakukan ini, saya akan mengambil alih.
sumber
newvalue
disimpan dalam variabel?sed "/^${varName}=/{h;s/=.*/=${varValue}/};\${x;/^$/{s//${varName}=${varValue}/;H};x}" ${VARFILE}
dengan variabel, tanda kutip ganda untuk memungkinkan substitusi variabel dan dan keluar dari$
yang bukan substitusi pada saat ini, juga jika nilai Anda disimpan di$$varName
:sed "/^${varName}=/{h;s/=.*/=${!varName}/};\${x;/^$/{s//${varName}=${!varName}/;H};x}" ${VARFILE}
Ini mungkin bisa dipersingkat. Ini bukan perintah sed tunggal dan ini juga menggunakan grep, tetapi ini pada dasarnya tampaknya apa yang Anda inginkan. Ini satu baris, dan itu mengedit file di tempat (tidak ada file temp).
sumber
Ini adalah
sed
pendekatan yang lebih sederhana , karena saya merasa tidaksed
hold space
mudah untuk dikerjakan. Jika Anda merasa nyamanhold space
, menggunakan pendekatan don_crissti memberi peluang tambahan untuk mempertahankan apa pun dari baris yang ada, tetapi ini biasanya sangat jarang.Dalam pendekatan ini, Anda cukup mencetak semua kecuali garis yang ingin Anda jatuhkan dan kemudian di akhir, tambahkan penggantian.
sumber
Berdasarkan jawaban lain, jika apa yang ingin Anda lakukan adalah mengganti nilai variabel jika variabel itu ada di file dan menambahkannya ke akhir file jika tidak (yang tidak
sed
dilakukan oleh perintah yang diposting ), Anda dapat mencoba ini:sumber
Ini sedikit lebih mudah dalam awk, meskipun "in-editing" tidak otomatis:
sumber
Cukup gunakan
grep
danecho
untuk membuat catatan kosong:Setiap baris lolos dengan kode kesalahan nol.
sumber
grep
danecho
Sebenarnya berfungsi dengan yang berikut:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Pada jawaban yang dipilih -i hilang.sumber
untuk melakukan ini dengan perl dan di tempat ini berfungsi dengan baik untuk saya:
sumber
grep
danecho
danperl
bukannya melakukan segala sesuatu dalamperl
? Juga, menulis ke file (>> my.file
) saat Anda membacanya (grep my.file
)?