2008-09-15 15 views
15

Phiên bản GNU sed 4.1.5 dường như không thành công với các ký tự quốc tế. Đây là tệp đầu vào của tôi:Tại sao sed thất bại với các ký tự Quốc tế và cách khắc phục?

Gras Och Stenar Trad - Từ Moja đến Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - Từ Möja đến Minneapolis DVD [G2007DVD] 7812 | Y

(Lưu ý các âm sắc trong dòng thứ hai.)

Và khi tôi làm

sed 's /.* | // '< in

Tôi sẽ chỉ thấy X và Y, vì tôi đã yêu cầu xóa TẤT CẢ ký tự lên đến' | ' và không gian bên ngoài nó. Thay vào đó, tôi nhận được:

X
Gras Och Stenar Trad - Từ M? Y

Tôi biết tôi có thể sử dụng tr để xóa ký tự quốc tế. đầu tiên, nhưng có cách nào để sử dụng sed?

+0

Vấn đề này dường như đã được giải quyết bằng GNU sed (được thử nghiệm trên phiên bản 4.2.2). – sorontar

Trả lời

24

Tôi nghĩ rằng lỗi xảy ra nếu mã hóa đầu vào của các tập tin khác với mã hóa ưa thích của môi trường của bạn.

Ví dụ: in là UTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in 
X 
Y 
$ LANG=de_DE.iso88591 sed 's/.*| //' < in 
X 
Y 

UTF-8 có thể yên tâm được hiểu là ISO-8859-1, bạn sẽ nhận được các ký tự lạ nhưng ngoài tất cả những gì là tốt.

Ví dụ: in là ISO-8859-1

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in 
X 
Gras Och Stenar Trad - From MöY 
$ LANG=de_DE.iso88591 sed 's/.*| //' < in 
X 
Y 

ISO-8859-1 không thể được hiểu là UTF-8, giải mã các tập tin đầu vào thất bại. Trận đấu kỳ lạ có lẽ là do thực tế là sed cố gắng phục hồi thay vì thất bại hoàn toàn.

Câu trả lời dựa trên Debian Lenny/Sid và sed 4.1.5.

+0

Điều đó cũng hoạt động và cho phép tôi sử dụng sed. Cảm ơn! – Dave

9

sed không được thiết lập tốt cho văn bản không phải ASCII. Tuy nhiên bạn có thể sử dụng (hầu như) cùng mã trong perl và nhận được kết quả bạn muốn:

perl -pe 's/.*\| //' x 
+0

Gợi ý này rất hữu ích. –