Làm cách nào để xóa U + 200B (không gian có chiều rộng bằng không) bằng sed


15

Tôi có một tệp rất lớn có không gian có độ rộng bằng không nằm rải rác trong suốt. Mất quá nhiều thời gian để mở và chỉnh sửa bằng cách sử dụng vivì vậy tôi muốn xóa tất cả các phiên bản của nhân vật bằng cách sử dụng sed. Vấn đề là, tôi không thể tìm ra làm thế nào để phù hợp với nhân vật! Tôi đã cố gắng sử dụng \u200B, \x{200b}. Có ý kiến ​​gì không?

Tôi đang chạy CentOS 5 nếu điều đó có ích gì cả.


Bản sao sed của bạn có hỗ trợ mã hóa Unicode mà tệp được mã hóa không? Nếu không, có lẽ không có cách nào tốt để làm điều đó đúng với sed, và tốt hơn hết bạn nên sử dụng một kịch bản python hoặc một cái gì đó tương tự ...
JanC

@JanC - thực sự, tôi đã đi với Python. Các tập tin được mã hóa với utf8, dường như đủ tiêu chuẩn để mọi thứ có thể xử lý nó. Tôi đã thêm tập lệnh python của mình bên dưới, trong trường hợp nó hữu ích với bất kỳ ai.
thetaiko

Câu trả lời:


11

Điều này dường như làm việc cho tôi:

sed 's/\xe2\x80\x8b//g' inputfile

Trình diễn:

$ /usr/bin/printf 'X\u200bY\u200bZ' | hexdump -C
00000000  58 e2 80 8b 59 e2 80 8b  5a                       |X...Y...Z|
$ /usr/bin/printf 'X\u200bY\u200bZ' | sed 's/\xe2\x80\x8b//g' | hexdump -C
00000000  58 59 5a                                          |XYZ|

Biên tập:

Dựa trên một phần câu trả lời của Gilles:

tr -d $(/usr/bin/printf "\u200b") < inputfile

Hoàn hảo - đây chính xác là những gì tôi đang tìm kiếm. Trong thực tế, tôi nhận thấy rằng cùng một bộ ký tự ( \xe2\x80\x8b) khi nhìn vào một số chuỗi mẫu trong Python. Cảm ơn bạn!
thetaiko

4

Hành vi của GNU sed với UTF-8 dường như không được xác định rõ. Thực nghiệm, bạn có thể làm cho nó thay thế các byte của đại diện UTF-8:

<old sed 's/\xe2\x80\e8b//g' >new

Ngoài ra, bạn có thể nhập ký tự vào vỏ của mình và sử dụng bất kỳ lệnh tiêu chuẩn nào trong ngôn ngữ UTF-8:

<old tr -d '​' >new
<old sed 's/​//g' >new

Trong zsh, bạn cũng có thể nhập ký tự thông qua chuỗi thoát:

<old tr -d $'\u200B' >new

Tính đến Bash 4.2, chuỗi Unicode được hỗ trợ bởi echo -e, printfchuỗi định dạng và ANSI trích dẫn chuỗi (ví dụ echo -e '\u1E4F', printf '\u01DD %s\n' 'X', mkdir $'\u0250)
Bị tạm dừng cho đến khi có thông báo mới.

0

Chà, trừ khi có ai có bất kỳ ý tưởng nào về cách sedthực hiện điều này (nhân tiện tôi vẫn quan tâm đến nó) để giải cứu ...

import sys, re
pattern = re.compile(u"\u200b")
f = open(sys.stdin, "rb")
for line in f:
    a = pattern.sub("", line.decode("utf8"))
    print a.encode("utf8"),
f.close()

2
Nếu bạn đang với lấy những khẩu súng lớn, thì đơn giản hơn nhiều perl -C -pe 's/\x{200B}//g'?
Gilles 'SO- ngừng trở nên xấu xa'

+1 cho Gilles cũng hoạt động trên Mac OSX. perl -C -pi.bak -e 's/\x{200B}//g' yourfilekết quả là tệp của bạn đã được sửa và bản sao lưu trong
tệp của bạn.bak
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.