Điểm:0

sed với thoát màu ANSI không thành công

lá cờ in

Tôi không biết tại sao điều này không hoạt động:

echo -e "$(echo "Đây là văn bản không màu" | sed "s/{Đây là văn bản không màu}/{Đây là \033[0;34văn bản không màu\033[0m}/g")"

nhưng điều này hoạt động tốt:

echo "$(echo "Xin chào thế giới" | sed "s/Xin chào/Chào/g")"

Bạn có thể giải thích cho tôi?

Bodo avatar
lá cờ pt
Vui lòng [chỉnh sửa] câu hỏi của bạn và giải thích chính xác ý của bạn với "điều này không hoạt động". Bạn nhận được sản lượng thực tế nào? Bạn muốn lấy gì?
Bruno Henrique Peixoto avatar
lá cờ in
Lệnh sau: start_command echo "đây là văn bản chưa tô màu" | sed 's/Đây là văn bản không màu/Đây là \033\[0;34văn bản không màu\033\[0m/g' end_commend vẫn không hoạt động
Bruno Henrique Peixoto avatar
lá cờ in
Bạn có thể dán kết quả cuối cùng. Tôi không nhận được nó chỉ bằng cách thay thế ```[``` bằng ```\[```
Bruno Henrique Peixoto avatar
lá cờ in
Vấn đề ban đầu lấy một chuỗi không có màu và thay thế nó bằng chuỗi có màu. Tuy nhiên, như bạn có thể thấy, phiên bản màu thiếu một số dấu gạch chéo ngược.
Bruno Henrique Peixoto avatar
lá cờ in
Vấn đề đã được giải quyết!
Điểm:2
lá cờ hr

Có một số vấn đề.

Đầu tiên, niềng răng {...} trong biểu thức sed của bạn không khớp với bất kỳ thứ gì trong đầu vào. Trong một Biểu thức chính quy cơ bản sed, các dấu ngoặc nhọn là nghĩa đen, trong khi trong một Biểu thức chính quy mở rộng, chúng bao quanh một bộ định lượng có dạng {n,m}. Chúng không bao giờ được sử dụng để nhóm.

Thứ hai, chuỗi màu của bạn không đúng định dạng - phần mở đầu cần được \033[0;34m còn hơn là \033[0;34

Thứ ba, ký tự dấu gạch chéo ngược \ là đặc biệt trong sed - đặc biệt, dấu gạch chéo ngược theo sau là chữ số thập phân trên RHS của thay thế là tham chiếu ngược đối với nhóm chụp; ít nhất là trong GNU sed, \0 đề cập đến toàn bộ LHS bị bắt tương đương với mã thông báo thay thế đặc biệt & ví dụ

$ tiếng vang | sed 's/foo/\033bar/'
foo33bar

Để vượt qua một nghĩa đen \ đến bên ngoài tiếng vang -e bạn sẽ cần \\ bên trong chuỗi thay thế sed.

Cuối cùng, \Mà còn đặc biệt đối với trình bao, do đó, bên trong dấu ngoặc kép "mềm" cần có dấu gạch chéo ngược bổ sung. Vì vậy:

echo -e "$(echo "Đây là văn bản không màu" | 
  sed "s/Đây là văn bản không màu/Đây là \033[0;34văn bản không màu\033[0m/")"

hoặc (thay thế dấu ngoặc kép bên trong bằng dấu ngoặc đơn 'mạnh'):

echo -e "$(echo "Đây là văn bản không màu" | 
  sed 's/Đây là văn bản không màu/Đây là \033[0;34văn bản không màu\033[0m/')"

Lưu ý rằng bạn không cần g công cụ sửa đổi để thực hiện một thay thế duy nhất trên mỗi dòng.

Xem thêm Tôi cần thoát những ký tự nào khi sử dụng sed trong tập lệnh sh?

Bruno Henrique Peixoto avatar
lá cờ in
Tôi đã làm việc theo cách của tôi ra ngoài. Hãy xem câu trả lời dưới đây.
Điểm:0
lá cờ in

giải pháp làm việc của tôi:

#!/bin/bash

color_text='đây là \033[0;34mvăn bản\033[0m'
uncolor_text='đây là văn bản'

printf %b\n "$(sed "s/$unColor_text/$Color_text/" <<< "$unColor_text")"

Bruno Henrique Peixoto avatar
lá cờ in
Cảm ơn bác bac0n! Nó thật thơm.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.