2011-12-19 34 views
37

Làm cách nào để xóa các ký tự unicode khỏi một loạt tệp văn bản trên thiết bị đầu cuối? Tôi đã thử điều này, nhưng nó đã không làm việc:Xóa các ký tự unicode khỏi các tệp văn bản - sed, các phương thức bash/shell khác

sed 'g/\u'U+200E'//' -i *.txt 

tôi cần phải loại bỏ những unicodes từ textfiles

U+0091 - sort of weird "control" space 
U+0092 - same sort of weird "control" space 
A0 - non-space break 
U+200E - left to right mark 
+0

mã hóa gì là tập tin văn bản của bạn trong? – unwind

Trả lời

37

Nếu bạn muốn loại bỏ ký tự đặc biệt CHỈ và bạn có python, bạn có thể:

CHARS=$(python -c 'print u"\u0091\u0092\u00a0\u200E".encode("utf8")') 
sed 's/['"$CHARS"']//g' </tmp/utf8_input.txt> /tmp/ascii_output.txt 
+0

Có lẽ không phải là đẹp nhất. Nhưng nó làm việc rất tốt cho tôi. Bằng cách xây dựng biến CHARS, nó làm cho sed dễ đọc hơn, và biến CHARS có thể dễ dàng được duy trì. Câu trả lời của Choroba cũng hoạt động, vì vậy tôi đoán đó là vấn đề về hương vị (và nếu bạn có Python tiện dụng). – Paulb

+1

Nó là một mã thay thế của phần python.'python -c 'print "" .join (bản đồ (unichr, phạm vi (0x80, 0xa0) + phạm vi (0x2000, 0x200f))). Mã hóa ("utf-8")' ' –

+1

trong os'es Linux gần đây bạn có thể viết ký tự unicode bằng cách nhấn Ctrl + Shift + u theo sau là mã số và , ví dụ: 'Ctrl + Shift + u 0019 ⏎' – smoebody

12

Sử dụng iconv:

iconv -f utf8 -t ascii//TRANSLIT </tmp/utf8_input.txt> /tmp/ascii_output.txt 

này sẽ dịch ký tự như "Š" vào "S" (hầu hết là những cái nhìn tương tự).

+1

chúng không phải ascii, tôi muốn giữ chúng trong utf8 nhưng tôi muốn thay thế các khoảng trống lạ thành chuỗi rỗng bình thường '" "' – alvas

+0

Xem câu trả lời khác của tôi –

+0

Không phải điều OP muốn, nhưng tôi cần chuyển đổi một unicode line-seperator (u2028) vào một dòng mới. Tôi sẽ thích sử dụng iconv hơn, nhưng tôi không thể tìm ra cách để làm điều đó. Là có một cách? –

49

rõ ràng chars tất cả phi ascii của file.txt

$ iconv -c -f utf-8 -t ascii file.txt 
$ strings file.txt 
+0

tôi muốn giữ mã hóa unicode. xin lỗi, vì vậy iconv không phải là giải pháp. – alvas

+2

Tại sao bạn không thể chạy ngược lại? tempf = $ (mktemp) biểu tượngv -c -f utf-8 -t ascii file.txt> $ tempf biểu tượngv -f ascii -t utf-8 $ tempf> file.txt –

+1

UTF-8 là tập con hợp lệ của ASCII. Việc chuyển đổi đảo ngược giữ cho tập tin không thay đổi. –

21

Đối utf-8 mã hóa unicode, bạn có thể sử dụng cụm từ thông dụng này cho sed:

sed 's/\xc2\x91\|\xc2\x92\|\xc2\xa0\|\xe2\x80\x8e//' 
+2

làm cách nào để tìm ánh xạ từ 'U + ...' đến '\ xc2 \ ...'? – alvas

+18

'echo -ne '\ u0091' | xxd' – kev

+1

Đây có thể là một khởi đầu tốt - http://www.utf8-chartable.de/ –

Các vấn đề liên quan