Thay thế dấu chấm (.) Trong sed


9

Vì vậy, câu hỏi thực tế là - có ai có ý tưởng làm thế nào để loại bỏ M-BM-nhân vật đặc biệt mà không có nguy cơ mất các nhân vật khác không?

Tôi có một chuỗi văn bản:

" . . ."

đó là

space dot space dot space dot

Tôi đang cố gắng thay thế tất cả sự xuất hiện của chuỗi này trong tệp văn bản thành

"..."

đó là

dot dot dot

Tôi đã cố gắng làm với sed:

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

Thật không may, nó không thay đổi tập tin đầu vào dù chỉ một chút. Tệp: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

Khi tôi cố gắng thay thế cùng một chuỗi trong trình soạn thảo văn bản (tôi sử dụng geany), nó được tìm thấy và thay thế đúng.

Lý do duy nhất tôi có thể nghĩ là một số (hoặc tất cả) những không gian đó không thực sự là không gian, mà là một số nhân vật đặc biệt.

Có ai có ý tưởng làm thế nào để tìm và thay thế chuỗi đó bằng sed (hoặc bất kỳ công cụ dòng lệnh nào khác) không? Vui lòng kiểm tra ý tưởng của bạn trên tệp của tôi, vì vấn đề không rõ ràng như có vẻ như - đây là lý do tại sao tôi hỏi về nó.

Sau khi sử dụng cat -Amyfile, có vẻ như các vấn đề đó không phải là không gian, mà là M-BM-ký tự đặc biệt. Sử dụng bất kỳ biểu tượng được .đề xuất cho tìm kiếm không phải là một ý tưởng tốt vì có nguy cơ một số nhân vật khác sẽ bị xóa.

Câu trả lời:


9

Đầu tiên tôi sẽ bắt đầu bằng cách thử nghiệm echovà chuyển nó vào sed, hơn là sử dụng một tập tin thực sự. Thứ hai, bạn có thể sử dụng {n}mô hình regex mở rộng để biểu thị bội số và giới hạn.

Bạn đã có khá nhiều ở đó nhưng regex của bạn mong đợi một không gian hàng đầu.

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

Lưu ý rằng \s?vẫn còn đủ tham lam để làm hỏng đầu ra, vì vậy tôi đã thêm một khoảng trắng vào đầu ra. Bạn có thể không muốn điều đó. Tôi cũng đã tạo không gian tùy chọn, vì vậy nó sẽ phù hợp với tất cả những điều sau đây:

...
. ..
.. .
. . .
 . . . 

Chỉ cần loại bỏ ?cờ tùy chọn .


Đưa ra vấn đề của bạn với unicode (trong các bình luận), bạn có thể buộc dữ liệu tương đương với ASCII của nó iconvvà sau đó làm dịu nó:

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text

Tôi ngạc nhiên khi bạn khuyên bạn nên sử dụng echothay vì trích dẫn một tệp, ít nhất là khi bạn gửi một tệp, bạn biết trình bao không giải thích bất cứ điều gì và cũng không phải là tiếng vang.
Flimm

@Flimm cho một ví dụ đơn giản với dấu chấm, đây thực sự không phải là vấn đề. Nếu bạn sẽ tải từ một tệp, đừng bận tâm cat- chỉ cần sedtải tệp (theo ví dụ của OP) nhưng không lưu nội tuyến (xóa -i, để bạn có thể xem và kiểm tra đầu ra).
Oli

@Oli Nó hoạt động với ví dụ của bạn, nhưng nó không hoạt động với tệp của tôi (trong câu hỏi của tôi, có một liên kết). Đó là vấn đề - lệnh của bạn và những người khác sẽ hoạt động, nhưng họ không làm như vậy vì có một số vấn đề với những dấu chấm đó. Vui lòng kiểm tra lệnh của bạn trên tập tin của tôi và bạn sẽ thấy rằng nó không hoạt động.
Rafal

1
@Rafal Nếu bạn nhìn vào cat -A sed-dotsbạn có thể thấy rằng "khoảng trắng" giữa các dấu chấm là các M-BM- ký tự đặc biệt ... Không chắc chắn cách chúng len lỏi vào đó nhưng chúng cần thay thế. Nếu bạn không thể nhắm mục tiêu tốt cho họ, điều này hoạt động: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Oli

@Oli Nó hoạt động. Cảm ơn bạn rất nhiều! Bạn có thể giải thích cú pháp? Bạn có chắc chắn rằng nó không có bất kỳ tác dụng phụ nào và sẽ không thay thế bất cứ thứ gì khác? Theo như tôi thấy, RegExp này sẽ phù hợp với bất kỳ nhân vật nào sau khi chấm. Tuy nhiên, M-BM không phải là một nhân vật, đó là ba nhân vật. Vì vậy, làm thế nào nó có thể làm việc?
Rafal

0

Hãy thử các cách sau để thay thế tất cả "." Thành "."

sed -r 's/\. /\./g' -i sed-dots

Nhưng đối với "..." đến "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots

0

Tôi có thể sử dụng tệp của bạn khi tôi chạy qua:

tr '\240' ' ' < sed-dots.txt > sed-dots.new

Điều này làm việc mà không cần một bước chuyển đổi:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt

Nó không hoạt động. Tôi đoán lý do đó là nhân vật M-BM kỳ lạ mà @Oli đã tìm thấy.
Rafal
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.