@ julio-Guerra: Tôi chạy vào một tình huống tương tự, cố gắng để xóa dòng như folowing (chú ý nhân vật Æ
) :
--MP_/yZa.b._zhqt9OhfqzaÆC
trong một tập tin, sử dụng
sed 's/^--MP_.*$//g' my_file
Mã hóa tập tin chỉ định bởi các lệnh Linux file
là
file my_file: ISO-8859 text, with very long lines
file -b my_file: ISO-8859 text, with very long lines
file -bi my_file: text/plain; charset=iso-8859-1
tôi đã cố gắng giải pháp của bạn, với hoán vị khác nhau (thông minh!); ví dụ:
LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file
nhưng không ai trong số đó hoạt động. Tôi đã tìm thấy hai cách giải quyết:
- Biểu thức sau
Perl
được thực hiện, tức làxóa dòng đó:
perl -pe 's/^--MP_.*$//g' my_file
[Đối với một lời giải thích của -pe
công tắc dòng lệnh, hãy tham khảo câu trả lời StackOverflow này:
Perl flags -pe, -pi, -p, -w, -d, -i, -t?]
- Cách khác, sau khi chuyển đổi mã hóa tệp thành UTF-8, biểu thức sed hoạt động (ký tự còn lại
Æ
, nhưng giờ đã được mã hóa UTF8):
iconv -f iso-8859-1 -t utf8 my_file > my_file.utf8
Như tôi đang làm việc với rất nhiều (1000) của email với mã hóa khác nhau, mà trải qua chế biến trung gian (chuyển đổi bash-kịch bản sang UTF-8 không luôn hoạt động), vì mục đích của tôi "Giải pháp 1 "ở trên có lẽ sẽ là giải pháp mạnh mẽ nhất.
Ghi chú:
- sed (GNU sed) 4.4
- perl v5.26.1 xây dựng cho x86_64-linux-thread-đa
hệ thống x86_64
- Arch Linux