Câu trả lời:
Bạn có thể thay thế dấu gạch chéo ngược bằng khoảng trắng như bạn hiển thị trong kết quả ví dụ:
sed 's/\\/ /g'
hoặc bạn có thể xóa nó khi bạn hiển thị trong mã của mình:
sed 's/\\//g'
Có thể có vấn đề với việc thoát dấu gạch chéo ngược để hủy bỏ ý nghĩa đặc biệt của nó. Dấu gạch chéo ngược là một ký tự đặc biệt được sử dụng để thoát cả trong vỏ và trong các biểu thức thông thường.
Lệnh bạn nhập vào dòng lệnh của shell hoặc script được xử lý trước tiên bởi shell để diễn giải ý nghĩa đặc biệt của các ký tự và thoát của chúng. Kết quả sau đó được chuyển đến lệnh được thực thi (như sed
) để thực hiện việc giải thích riêng cho các ký tự. Khi bạn đang xây dựng một lệnh, thủ tục tinh thần là cách ngược lại: đầu tiên thêm lối thoát cho regex sau đó thêm lối thoát cho shell.
Trong biểu thức chính (nhập vào các lệnh như sed
, grep
v.v.), dấu gạch chéo ngược có thể được thoát bằng dấu gạch chéo ngược như thế này: \\
và bạn cũng có thể sử dụng biểu thức tập hợp [\]
như bạn đã sử dụng vì dấu gạch chéo ngược làm mất ý nghĩa đặc biệt của nó.
Trong một shell (như bash
) bạn có thể thoát dấu gạch chéo ngược bằng dấu gạch chéo ngược. Vì vậy, thay vì \
viết \\
. Việc kết hợp chuỗi giữa các dấu ngoặc kép "
làm cho hành vi dấu gạch chéo ngược trở nên phức tạp hơn <1> nhưng dấu gạch chéo kép sẽ vẫn tạo ra dấu gạch chéo ngược đơn. Việc kết hợp chuỗi giữa các dấu ngoặc đơn '
làm cho mọi ký tự được xử lý theo nghĩa đen ngoại trừ '
.
Nếu bạn muốn sử dụng dấu ngoặc kép , bạn có thể sử dụng một trong các cách sau:
sed "s/\\\\//g"
- Thoát \
bằng \
vỏ và thoát mọi thứ \
trong regex một lần nữa. Trong thực tế, dấu ngoặc kép là không cần thiết trong trường hợp này bởi vì mọi ký tự đặc biệt được thoát đúng.
sed "s/[\\]//g"
- Thoát khỏi vỏ bằng dấu gạch chéo ngược \
và trong regex sử dụng một bộ [
]
.
sed "s/[\]//g"
- Có, ví dụ của bạn sẽ hoạt động trong môi trường tuân thủ POSIX! Giữa các dấu ngoặc kép \
thể hiện chính nó trừ khi nó đứng trước một ký tự đặc biệt trong ngữ cảnh của dấu ngoặc kép: $`"\
hoặc một dòng mới. Có vẻ như trong trường hợp của bạn, vỏ hoặc vỏ sed
không tuân theo tiêu chuẩn POSIX.
Với các trích dẫn đơn, bạn cũng có thể sử dụng chuỗi như bạn đã sử dụng hoặc một cách ngắn hơn:
sed 's/[\]//g'
sed 's/\\//g'
Trong awk, tôi sẽ làm như thế này,
$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
sed 's/\\//'
Đặt một \
trước \
như bạn làm với hầu hết các nhân vật đặc biệt.
g
cờ không rõ lý do. Điều này thay đổi hành vi của lệnh nhưng thay đổi như vậy không được yêu cầu trong câu hỏi. Nếu không, trả lời của bạn không mang lại điều gì mới so với các câu trả lời trước đó.
sed
(hoặc có thể bạn đang chạy lệnh đó từ trình bao không phải POSIX?). Bạn không cầnsed
mặc dù,tr
là đủ :tr -d '\\' < P
.