2014-11-21 15 views
5

Tôi có lệnh sau để thay thế các ký tự Unicode bằng các ký tự ASCII.Cách thay thế các ký tự Unicode bằng ASCII

sed -i 's/Ã/A/g' 

Vấn đề là Ã không được nhận dạng bởi lệnh sed trong môi trường Unix của tôi vì vậy tôi giả sử bạn thay thế bằng giá trị thập lục phân. Cú pháp sẽ trông như thế nào nếu tôi sử dụng C3 thay thế?

Tôi đang sử dụng lệnh này làm mẫu cho nhân vật khác tôi muốn thay thế với các không gian trống như:

sed -i 's/©// g'

+0

ý bạn là như thế này? http://stackoverflow.com/questions/22450563/sed-matching-unicode-blocks-with – Leo

+1

Thiết bị đầu cuối của bạn sử dụng bộ ký tự nào? Và văn bản đầu vào sử dụng mã hóa nào? Ã trong UTF-8 là 0xC3 0x83 và ký tự 0x83 là mã kiểm soát trong ISO 8859-1, do đó có thể là một vấn đề. Tôi cho rằng bạn không thể đặt 'LANG = en_US.UTF-8' trên hệ thống của bạn. – yellowantphil

+0

"sed" sẽ thực hiện công việc. Xin vui lòng xem câu trả lời của tôi. – ajaaskel

Trả lời

2

Bạn có thể sử dụng iconv:

iconv -f utf-8 -t ascii//translit 
+3

Bạn có nghĩa là biểu tượng GNUv. Không phải tất cả các phiên bản của chuyển ngữ hỗ trợ iconv. –

+1

Có, nhưng anh ấy có thể thử xem – tinySandy

+0

Cảm ơn nhưng tôi đang sử dụng mẫu này làm mẫu để tạo các lệnh sed khác sẽ thay thế các ký tự nhất định bằng khoảng trống: sed -i 's/©// g' –

9

Có thể sử dụng giá trị hex trong "sed".

echo "Ã" | hexdump -C 
00000000 c3 83 0a           |...| 
00000003 

Ok, ký tự đó là kết hợp hai byte "c3 83". Hãy thay thế bằng một byte đơn "A":

echo "Ã" |sed 's/\xc3\x83/A/g' 
A 

Giải thích: \ x cho biết "sed" có mã hex sau.

+0

Thông thường tôi sẽ viết những cái với <<< nhưng đường ống cho ý tưởng tốt hơn cho một người đọc trung bình những gì đang xảy ra. – ajaaskel

+0

Ý của bạn là "viết chúng bằng <<<"? – isomorphismes

+1

hexdump -C <<< Ö – ajaaskel

3

Hãy thử thiết LANG=C và sau đó chạy nó trên phạm vi Unicode:
echo "hi ☠ there ☠" | LANG=C sed "s/[\x80-\xFF]//g"

3

Ngoài ra còn có uconv, từ ICU.

Ví dụ:

  • uconv -x "::NFD; [:Nonspacing Mark:] > ; ::NFC;": để loại bỏ dấu
  • uconv -x "::Latin; ::Latin-ASCII;": cho một phiên âm Latin/ascii
  • uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;": cho một phiên âm Latin/ascii và loại bỏ các điểm mã còn lại> 0x7F
  • ...

echo "À l'école ☠" | uconv -x "::Latin; ::Latin-ASCII; ([^\x00-\x7F]) > ;" cung cấp: A l'ecole

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