Saya seorang pemula Linux yang relatif. Misalkan saya memiliki file teks a.txt
yang berisi teks berikut:
A
B
C
Sekarang, jika saya ingin mengubah teks pada baris 2 (yang berisi B
), saya dapat menggunakan sed
berikut ini perintah:
sed -i '2s/^.*$/X/' a.txt
untuk mengubah B
ke X
, misalnya.
Tapi sekarang misalkan saya ingin menulis sed
perintah yang mengubah teks pada baris 2 menjadi sesuatu yang termasuk variabel string bash. Saya ingin mengubah teks pada baris 2 menjadi fname="myaddress"
, di mana tanda kutip disertakan secara eksplisit, dan di mana myaddress
adalah variabel string bash (didefinisikan di tempat lain). Untuk mencoba melakukan ini, saya telah membuat skrip bash shell bernama mytest.sh
dan berisi sebagai berikut:
#!/bin/bash
myaddress="/home/"
echo fname="$myaddress"
head a.txt
sed -i '2s/^.*$/fname="$myaddress"/' a.txt
head a.txt
Sekarang, echo fname="$myaddress"
mencetak fname="/home/"
, yang merupakan teks yang saya inginkan berada di baris 2 a.txt
. Namun, sed
sebagai gantinya mencetak fname="$myaddress"
ke baris 2 dari a.txt
, mungkin karena berada di dalam apostrof di sekitarnya. Dengan kata lain, output dari skrip bash shell di atas adalah:
fname="/home/"
A
B
C
A
fname="$myaddress"
C
Pertanyaan saya adalah, bagaimana saya bisa mendapatkan sed
untuk benar-benar mencetak nilai disimpan di myaddress
dan dirujuk oleh $myaddress
?
Jawaban yang Diterima:
Ada dua masalah:Pertama, seperti yang telah dicatat oleh Kevin, variabel shell harus diapit tanda kutip ganda jika ingin diekspansi oleh shell. Kedua, string pengganti Anda berisi /
, jadi Anda tidak dapat menggunakan /
sekaligus sebagai pembatas untuk sed
. Jika Anda mengetahui beberapa karakter tersebut, ucapkan ,
, pasti tidak akan muncul dalam string pengganti, Anda dapat menggunakan karakter itu sebagai sed
pembatas, jadi Anda mendapatkan
sed -i '2s,^.*$,fname="'"$myaddress"'",' a.txt