Có hai vấn đề trong echo
lệnh của bạn .
Tôi mở rộng các biến cho ngắn gọn.
$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test
Vấn đề đầu tiên: dấu gạch chéo ngược bị mất ở đâu đó giữa ma thuật sed và ma thuật vỏ. Bạn phải thoát khỏi chúng.
$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test
Vẫn không hoạt động. Có lẽ thoát nhiều hơn?
$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test
Cuối cùng các dấu gạch chéo ngược đang đi qua. Tôi không biết tại sao chúng ta cần ba dấu gạch chéo ngược, đó là một số phép thuật sed kỳ lạ.
Vấn đề thứ hai: echo -e
là vô nghĩa. -e
cho phép giải thích các dấu gạch chéo ngược, nhưng tất cả echo -e
được giải thích là "test TEST test"
. Các lối thoát dấu gạch chéo ngược đến từ sed, không quan tâm đến chúng và in chúng thô.
Những gì bạn muốn là đây:
$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test
với TEST đậm trong đầu ra.
Đây là kịch bản đầy đủ với các thay đổi:
#!/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}"
hiển thị `\ AAAA`. Thật đáng tiếc, vì tôi cần phải giữ đều đặn_color_constants và SED_color_constants. Trên thực tế, tôi muốn chỉ có thường xuyên_color_constants và sửa các tùy chọn echo và sed để có được những gì tôi muốn.