Xóa dấu gạch chéo ngược khỏi tệp văn bản


10

Tôi có

Đầu vào:

 NISHA =\455  

Đầu ra:

 NISHA = 455

Tôi muốn loại bỏ \từ đầu ra. Tôi đã cố gắng sử dụng lệnh sed "s/[\]//g" Pnhưng nó không hoạt động và nó báo lỗi:

character found after backslash is not meaningful

3
Bạn dường như có một triển khai phi POSIX 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ần sedmặc dù, trlà đủ : tr -d '\\' < P.
Stéphane Chazelas

Câu trả lời:


20

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'

Nhân vật đặc biệt

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.

  1. Trong biểu thức chính (nhập vào các lệnh như sed, grepv.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ó.

  2. 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ỏ sedkhô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'


6

Bạn phải thoát khỏi dấu gạch chéo ngược. Thử cái này xem sao:

sed 's/\\//g'

3

Nếu bạn không muốn các giải pháp sed, hãy thử với các lệnh sau:

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11

2

Trong awk, tôi sẽ làm như thế này,

$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455

1
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.


Bạn đã bỏ qua gcờ 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 đó.
pabouk
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.