@ julio-guerra: я столкнулся с подобной ситуацией, пытаясь удалить строки, такие как следующие (обратите внимание на символ Æ
):
--MP_/yZa.b._zhqt9OhfqzaÆC
в файле, используя
sed 's/^--MP_.*$//g' my_file
Кодировка файла, указанная командой Linux file
, была
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
Я попробовал ваше решение (умное!) С различными перестановками; например.,
LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file
но ни один из них не работал. Я нашел два обходных пути:
- Сработало следующее выражение
Perl
, т.е. удалили эту строку:
perl -pe 's/^--MP_.*$//g' my_file
[Описание параметров командной строки -pe
см. В ответе StackOverflow:
флаги Perl -pe, -pi, -p, -w, -d, -i, -t? ]
- В качестве альтернативы, после преобразования кодировки файла в UTF-8 сработало выражение sed (символ
Æ
остался, но теперь был закодирован в UTF8):
iconv -f iso-8859-1 -t utf-8 my_file > my_file.utf8
Поскольку я работаю с большим количеством (1000) писем с различными кодировками, которые подвергаются промежуточной обработке (преобразования с использованием bash-скриптов в UTF-8 не всегда работают), для моих целей приведенное выше «решение 1», вероятно, будет наиболее надежное решение.
Примечания:
- sed (GNU sed) 4.4
- Perl v5.26.1 построен для x86_64-linux-thread-multi
- Система Arch Linux x86_64