Ada dua masalah dalam echo
perintah Anda .
Saya memperluas variabel untuk singkatnya.
$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test
Masalah pertama: backslash hilang di suatu tempat antara sihir sed dan sihir shell. Anda harus melarikan diri dari mereka.
$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test
Masih tidak berfungsi. Mungkin lebih banyak melarikan diri?
$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test
Akhirnya backslash akan datang. Saya tidak tahu mengapa kita membutuhkan tiga garis miring terbalik, itu adalah sihir sed yang aneh.
Masalah kedua: echo -e
tidak ada gunanya. -e
memungkinkan interpretasi backslash lolos, tetapi semua echo -e
bisa menafsirkannya "test TEST test"
. The backslash lolos berasal dari sed, yang tidak peduli tentang mereka dan mencetaknya mentah.
Yang Anda inginkan adalah ini:
$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test
dengan UJI tebal dalam output.
Berikut ini skrip lengkap dengan perubahan:
#!/bin/bash
ColorOff='\\\e[0m' # Text Reset
BWhite='\\\e[1;37m' # Bold White
string="test TEST test"
echo -e $(echo "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g")
echo -e "${BWhite}AAAA${ColorOff}"
menunjukkan `\ AAAA`. Sayang sekali, karena daripada saya perlu menjaga regular_color_constants dan SED_color_constants. Sebenarnya, saya hanya ingin regular_color_constants, dan memperbaiki opsi echo dan sed untuk mendapatkan yang saya inginkan.$string
mengandung backslash?) Dan sedikit lebih rumit dari yang diperlukan. Untuk memahami mengutip, ambil satu per satu. Misalnya tiga backslash sama sekali bukan sihir: pertama ada tanda kutip ganda, dan"\\\e"
merupakan string dua karakter\e
; kemudian ia mengerti\e
sebagai "karaktere
secara harfiah".