Tôi muốn chỉnh sửa tệp qua tập lệnh sed trong tập lệnh bash. Tôi muốn điều này dễ bảo trì sau này; dễ hiểu và sửa đổi. Chuỗi thay thế trông giống như:Làm cách nào để thoát khỏi dấu gạch chéo ngược trong tập lệnh sed được nhúng trong tập lệnh bash
PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]'
Trong một thế giới hoàn hảo, nó sẽ như thế này:
sed -i "s/^PS1.*$/PS1='\[\e[1;32m\][\[email protected]\h \W]\$\[\e[0m\]'/g" /etc/skel/.bashrc
Vấn đề là bash đó và sed được tước ra \
đưa ra các kết quả sau đây trong tập tin:
PS1='[e[1;32m][@h W]$[e[0m]'
Không thể sử dụng báo giá đơn lẻ. Một giải pháp bạo lực là sử dụng lối thoát, nhưng để làm việc này tôi có một đường trông thật xấu xí:
sed -i "s/^PS1.*$/PS1='\\\\[\\\\e[1;32m\\\\][\\\\[email protected]\\\\h \\\\W]\\\\$\\\\[\\\\e[0m\\\\]'/g" /etc/skel/.bashrc
Tôi muốn tập lệnh có thể đọc được và tự chứa (không sử dụng tệp bên ngoài). Bất kỳ lựa chọn thay thế nào ở trên?
Sử dụng dấu nháy đơn xung quanh mọi thứ như regex trừ khi bạn hoàn toàn cần một số biến nội suy vào chuỗi. Thậm chí sau đó, sử dụng dấu nháy đơn xung quanh hầu hết các regex, và chỉ sử dụng dấu ngoặc kép xung quanh phần đó phải được nội suy. Sử dụng một ví dụ được tạo thành: 'sed -e 's /\.\*'"$ 1"' \ * \ ./ ab '"$ 2"' c '\' 'd /' $ 3' hoặc gì đó dọc theo các dòng đó. Trình tự ''\' '' là cách bạn nhúng một dấu nháy đơn vào dòng lệnh; trích dẫn đơn đầu tiên kết thúc phần trích dẫn một lần hiện tại; dấu gạch chéo ngược trích dẫn nhúng một trích dẫn duy nhất vào chuỗi; trích dẫn đơn thứ ba tiếp tục trích dẫn đơn. –