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?


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).


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.