Đầu ra màu Bash không thành công


8

Là vấn đề sed hay echo? Tôi đang làm gì sai?

$> cat ~/bin/color_test.sh 
#!/bin/bash

ColorOff='\e[0m'       # Text Reset
BWhite='\e[1;37m'      # Bold White

string="test TEST test"
echo -e "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g"

$> ~/bin/color_test.sh 
test e[1;37mTESTe[0m test

KIỂM TRA với sự nổi bật táo bạo là những gì đã được mong đợi.

Câu trả lời:


11

sedkhông coi \elà một chuỗi thoát. Với GNU sed và hầu hết các triển khai sed khác ngoài đó, \etrong một svăn bản thay thế chỉ có nghĩa e. Dấu gạch chéo ngược duy nhất mà bạn có thể sử dụng một cách hợp lý trong svăn bản thay thế là \\có nghĩa là dấu gạch chéo ngược, \&có nghĩa là một chữ &, \/(trong đó /là ký tự phân cách) cho một nghĩa đen /\1thông qua phản hồi \9. GNU sed và BusyBox (nhưng không phải ví dụ OpenBSD sed) bổ sung \ncho một dòng mới. Do đó, đầu ra của lệnh sed của bạn có nghĩa đen e.

Trong bash, bạn có thể dễ dàng đặt một ký tự thoát theo nghĩa đen trong các biến của mình ngay từ đầu. \elà một trong những chuỗi thoát được công nhận bởi $'…'công trình.

ColorOff=$'\e[0m'       # Text Reset
BWhite=$'\e[1;37m'      # Bold White

6

Có hai vấn đề trong echolệ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 -elà vô nghĩa. -echo 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")

Btw, 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.
ДМИТРИЙ МАЛИКОВ

Giải pháp đó khá mong manh (nếu $stringcó dấu gạch chéo ngược thì sao?) Và phức tạp hơn một chút so với cần thiết. Để hiểu được trích dẫn, hãy thực hiện từng việc một. Ví dụ, ba dấu gạch chéo ngược hoàn toàn không phải là phép thuật sed: đầu tiên có dấu ngoặc kép và "\\\e"là chuỗi hai ký tự \e; sau đó sed hiểu \enhư là một nhân vật theo enghĩa đen.
Gilles 'SO- ngừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.