Изменять окончания строк и кодировку файла одновременно

485
George Simms

У меня есть несколько файлов с окончаниями строк Windows и латинской кодировкой 1, которые мне нужно преобразовать в окончание строк Unix и utf-8.

Конечно, я могу

for file in ./*.csv; do sed s'/^M//' "$file" > "$.bak" iconv -f iso-8859-1 -t utf8 "$.bak" > "$file" rm "$.bak" done 

Но есть ли общедоступный инструмент, который может сделать обе эти вещи одновременно? Может быть, это не самый эффективный способ. (Может, iconv?)

0
Я твердо верю, что ответ «нет», поскольку эти две задачи совершенно разные, и нет смысла писать один инструмент для выполнения обеих задач одновременно, особенно в том, что касается философии Unix. Но кто знает, когда кто-то достаточно сумасшедший ... Abel Cheung 8 лет назад 1

1 ответ на вопрос

0
fd0

I would make some slight modifications to your script. First don't use ls in your for loop, use *.csv because the glob will handle non-printable characters and spaces in file names. Instead of using sed's inplace redirect to $file.bak. If strings is available on your system then replace sed with strings. And always remember to quote variables.

 for file in *.csv do sed 's/^M//' "$file" > "$.bak" #strings "$file" > "$.bak" iconv -f -iso-8859-1 -t utf8 "$.bak" > "$file" rm "$.bak" done 
Спасибо, я обновлю вопрос соответственно, но это действительно не отвечает на вопрос. Кроме того, это несколько менее явный способ преобразования концов строк, и читатель может быть озадачен мотивацией строки - сработает ли она, если файл содержит буквы с валлийским акцентом, такие как wциркулярный? George Simms 8 лет назад 0
Ну, один инструмент может быть не таким эффективным, как два или более инструментов. Мой ответ был нацелен на то, чтобы сделать ваш код более эффективным. Глобус должен быть намного быстрее, чем при использовании `ls`. `strings` слепо изменяет возврат каретки и повторный запуск каретки / переводы новой строки на новые строки. `strings` должен быть быстрее, и если бы я знал, что последняя строка вашего CSV-файла была прервана, я бы предложил использовать` tr` вместо `strings` .iconv` - единственный инструмент, который я знаю для вашей цели. fd0 8 лет назад 0