Одночасно міняйте закінчення рядків та кодування файлу


0

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

Звичайно я можу

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

Але чи є загальнодоступний інструмент, який може робити обидві ці речі одночасно? Можливо, це не найефективніший спосіб. (Може бути, iconv?)


1
Я впевнений, що відповідь - «ні», оскільки ці дві задачі дуже різні, і не має сенсу писати єдиний інструмент для виконання обох завдань одночасно, особливо це стосується філософії Unix. Але еге, хто знає, коли хтось досить божевільний ...
Абель Чеунг

Відповіді:


0

Я б вніс кілька незначних змін до вашого сценарію. Спочатку не використовуйте lsу своєму forциклі, використовуйте, *.csvтому що глобус буде обробляти символи та пробіли, що не друкуються, у іменах файлів. Замість того, щоб використовувати перенаправлення inplace in $file.bak. Якщо stringsце доступно у вашій системі, замініть sedна strings. І завжди пам’ятайте, щоб цитувати змінні.

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

Дякую, я оновлю це питання відповідно, але це насправді не відповідає на питання. Крім того, це дещо менш явний спосіб перетворення закінчень рядків, і читач може бути розгублений щодо мотивації рядка - чи спрацює це, якщо файл містить букви з наголосом валійської мови, як w circflex?
Джордж Сіммс

Ну, один інструмент може бути не таким ефективним, як два чи більше інструментів. Моя відповідь була спрямована на те, щоб зробити ваш код більш ефективним. Глобус повинен бути набагато швидшим, ніж використання ls. stringsсліпо змінювати повернення каретки та повернення / повернення каретки до нових рядків. stringsповинно бути швидше, і якби я знав, що останній рядок вашого файлу csv припинено, я б запропонував використовувати trзамість strings.iconv` єдиний інструмент, який я знаю для вашої мети.
fd0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.