Saya menggunakan kode di bawah ini untuk mengganti string di dalam skrip shell.
echo $LINE | sed -e 's/12345678/"$replace"/g'
tetapi diganti dengan $replace
alih - alih nilai variabel itu.
Adakah yang bisa tahu apa yang salah?
Saya menggunakan kode di bawah ini untuk mengganti string di dalam skrip shell.
echo $LINE | sed -e 's/12345678/"$replace"/g'
tetapi diganti dengan $replace
alih - alih nilai variabel itu.
Adakah yang bisa tahu apa yang salah?
Jawaban:
Jika Anda ingin menafsirkan $replace
, Anda tidak boleh menggunakan tanda kutip tunggal karena mereka mencegah substitusi variabel.
Mencoba:
echo $LINE | sed -e "s/12345678/\"${replace}\"/g"
dengan asumsi Anda ingin kutipan dimasukkan. Jika Anda tidak menginginkan kutipan, gunakan:
echo $LINE | sed -e "s/12345678/${replace}/g"
Salinan:
pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _
Berhati-hatilah untuk memastikan bahwa ${replace}
tidak ada karakter yang penting sed
(seperti /
misalnya) karena akan menyebabkan kebingungan kecuali lolos. Tetapi jika, seperti yang Anda katakan, Anda mengganti satu nomor dengan yang lain, itu seharusnya tidak menjadi masalah.
set
juga tidak perlu (dan bagaimana Anda akan menggunakannya?). Cuma replace=987654321
.
export
untuk memastikan bahwa variabel ditetapkan untuk anak-anak tetapi, seperti yang Anda katakan, Anda dapat dengan mudah menghindarinya. Namun, penggunaan atau tidak dari export
tidak relevan di sini (masalah gaya) dan tidak berpengaruh pada jawaban sebenarnya, yaitu bagaimana menggunakan variabel dalam sed
perintah.
-i
opsi tersebut. Tahukah kamu mengapa? atau bagaimana cara membuatnya bekerja?
$
atau `
dalam sed
skrip untuk di-escape dengan garis miring terbalik, untuk melindunginya dari mekanisme substitusi shell untuk string yang dikutip ganda.
Anda bisa menggunakan shell (bash / ksh).
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
/bin/sh
di banyak Linux modern.
Tidak spesifik untuk pertanyaan tersebut, tetapi untuk orang-orang yang membutuhkan jenis fungsionalitas yang sama yang diperluas untuk kejelasan dari jawaban sebelumnya:
# create some variables
str="someFileName.foo"
find=".foo"
replace=".bar"
# notice the the str isn't prefixed with $
# this is just how this feature works :/
result=${str//$find/$replace}
echo $result
# result is: someFileName.bar
str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result
# result is: someFileName.sally because ".foo" was not found
Menemukan solusi yang anggun .
echo ${LINE//12345678/$replace}
echo $LINE | sed -e 's/12345678/'$replace'/g'
Anda masih dapat menggunakan tanda kutip tunggal, tetapi Anda harus "membukanya" jika ingin variabel diperluas di tempat yang tepat. jika tidak, string akan diambil "secara harfiah" (seperti @paxdiablo dinyatakan dengan benar, jawabannya juga benar)
$replace
luar tanda kutip apa pun akan menyebabkan shell melakukan tokenisasi spasi putih dan perluasan karakter pengganti pada nilainya. Ini akan tampak bekerja dengan nilai-nilai sederhana, tetapi bisa meledak secara dramatis pada string nontrivial. Jangan gunakan ini dalam kode produksi.
Untuk membiarkan shell Anda memperluas variabel, Anda perlu menggunakan tanda kutip ganda seperti
sed -i "s#12345678#$replace#g" file.txt
Ini akan rusak jika $replace
berisi sed
karakter khusus ( #
, \
). Tetapi Anda dapat melakukan praproses $replace
untuk mengutipnya:
replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt
Saya memiliki persyaratan yang mirip dengan ini tetapi var pengganti saya mengandung ampersand. Melarikan diri dari ampers dan seperti ini memecahkan masalah saya:
replace="salt & pepper"
echo "pass the salt" | sed "s/salt/${replace/&/\&}/g"
Gunakan ini sebagai gantinya
echo $LINE | sed -e 's/12345678/$replace/g'
ini berfungsi untuk saya, cukup hapus tanda kutip
Saya lebih suka menggunakan tanda kutip ganda, karena quptes tunggal sangat kuat karena kami menggunakannya jika tidak dapat mengubah apa pun di dalamnya atau dapat memanggil penggantian variabel.
jadi gunakan tanda kutip ganda.
echo $LINE | sed -e "s/12345678/$replace/g"