sed di bash tidak berfungsi

3

Saya mencoba menggunakan sed editor aliran di bash untuk mengganti string dalam file ke string baru yang saya masukkan, sejauh ini saya punya ini:

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i 's/$updatenaamold/$updatenaamnew/g' $naam_dir
echo "name changed"

Ini seharusnya bekerja! Tapi entah bagaimana, di file yang ingin saya edit ada nama yang disebut "bryan" Saya ingin mengeditnya menjadi "bryan name". Saya telah memasukkan nama lama ke dalam variabel yang harus saya masukkan dengan jelas, dan nama baru juga di dalam variabel. Dapatkah seseorang menunjukkan kepada saya mengapa itu tidak berhasil?

Bryan
sumber
Bisakah Anda menggunakan pemformatan kode yang lebih baik? Saya mengalami kesulitan memahami kode. (Ok, saya mencoba dengan melihat kode sumber halaman)
LatinSuD

Jawaban:

6

Cukup gunakan penawaran ganda dan bukan penawaran tunggal. (Kutipan tunggal tidak memungkinkan ekspansi variabel).

echo "name to change"
read updatenaamold
echo "enter new name:"
read updatenaamnew
sed -i "s/$updatenaamold/$updatenaamnew/g" $naam_dir
echo "name changed"

Catatan 1: Jika $naam_dirdirektori, itu juga tidak akan berfungsi. Afaik sedbekerja berdasarkan file-per-file.

Catatan 2: Jika pengguna memasukkan karakter khusus (seperti / ^ $ []:) hal-hal tidak akan berfungsi seperti yang diharapkan, karena itu akan membingungkan. Penanganan masalah (tidak yakin apakah ini akan menjadi cara terbaik):

updatenaamold=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamold" | sed 's/[^a-zA-Z0-9]//g' )
updatenaamnew=$( POSIXLY_CORRECT=1 /bin/echo "$updatenaamnew" | sed 's/[^a-zA-Z0-9]//g' )

Tambahkan sebelum sed. Ini akan menghapus karakter selain huruf dan angka (tanpa spasi, tanpa karakter internasional, dll). Pendekatan lain akan dibatalkan ketika menemukan karakter aneh (dan mencegah kesalahan tidak disengaja).

LatinSuD
sumber
Hmm saya mengerti, saya mengubahnya dan berhasil! Catatan1: Apakah ada cara untuk menghindari kecelakaan saat membuat hal-hal seperti (\ ^ [] &) seperti yang Anda katakan?
bryan
Terima kasih LatinSuD, saya akan mencoba menambahkan ini ke skrip saya ketika saya pulang. Bisakah Anda menjelaskan baris setelah Note2 untuk saya :)? Saya ingin sepenuhnya memahami apa yang dilakukannya sebelum saya menerapkannya. Terima kasih lagi!
bryan
1

Karena Anda menggunakan, bashsaya sarankan menggunakan memeriksa manipulasi string bash .

Homolka yang kaya
sumber