Как определить конец строки файла

У меня есть куча (сотни) файлов, которые должны иметь окончания строки Unix. Я сильно подозреваю, что у некоторых из них есть окончания строк Windows, и я хочу программно выяснить, какие именно.

Я знаю, что могу просто бежать

flip -u
or something similar in a script to convert everything, but I want to be able to identify those files that need changing first.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
53
0
50 218
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Windows использует символы 13 и 10 для окончания строки, unix только один из них (я не помню, какой). Таким образом, вы можете заменить char 13 и 10 на char 13 или 10 (тот, который использует unix).

Вы можете использовать инструмент file, который сообщит вам тип окончания строки. Или вы можете просто использовать dos2unix -U, который преобразует все в окончание строк Unix, независимо от того, с чего он начинался.

файл не показывает конец строки. Бывший. : "файл .bashrc => .bashrc: текст ASCII на английском языке" Нужны дополнительные ключи?

Fedir RYKHTIK 09.02.2012 14:32

@Fedir: Да, это так, просто если у файла есть обычные окончания строк LF, то он не будет выводить никаких результатов. Но если в файле есть окончания CRLF, CR или смешанные строки, он сообщит вам об этом.

Adam Rosenfield 10.02.2012 01:55

Не работал у меня с Perl-скриптом только для CRLF в OS X. Может быть, расширение GNU?

Tim Yates 12.06.2012 00:34

Это работает с некоторыми типами файлов, но не работает с другими. В Linux он не сообщает, например, окончания строк для файлов html.

Edward Anderson 09.04.2013 08:48

"file foo.txt" отлично работал в OS X 10.9. Он напечатал «foo.txt: текст ASCII с терминаторами строки CRLF»

Bogdan Calmac 14.03.2014 21:19

Почти 10 лет спустя, безусловно, стоит упомянуть, что dos2unix имеет опцию -i для получения информации о файле. Я считаю, что это самый надежный способ определить виновных. Это также описано в unix.stackexchange.com/a/231408/17800

Moreaki 05.11.2017 02:16

Unix использует один байт, 0x0A (LineFeed), тогда как Windows использует два байта, 0x0D 0x0A (возврат каретки, перевод строки).

Если вы никогда не видите 0x0D, скорее всего, это Unix. Если вы видите пары 0x0D 0x0A, скорее всего, это MSDOS.

Ответ принят как подходящий

Вы можете использовать grep

egrep -l $'\r'$ *

по какой-то причине, когда я запускаю эту команду в оболочке MacOS X, я получаю список всех файлов в каталоге. Даже тот, который я недавно сгенерировал с помощью "echo" test "> torderform6.cpp". Есть идеи, что может пойти не так?

Adrian Grigore 25.02.2009 21:33

Он просто перечисляет все файлы в папке для меня в Ubuntu.

rjmunro 09.05.2011 15:52

Эта команда по-прежнему будет выводить список файлов, на которых был запущен dos2unix.

Phyxx 17.01.2012 06:16

используйте $(echo -e '\r'). Если у вас нет bash, выполните расширение ASCII за вас (замените $'\r'$ на него)

Bryce Guinta 16.06.2016 00:39

На Mac я использую: grep -E -rl '\ r'.

LanDenLabs 18.08.2016 16:52

Что-то вроде:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

хотя некоторые из этих регулярных выражений могут нуждаться в доработке и приведении в порядок.

Это выведет ваш файл с WIN, MAC или UNIX в конце каждой строки. Хорошо, если ваш файл представляет собой ужасный беспорядок (или разногласия) и имеет смешанные окончания.

Работал для меня на Ubuntu, принятый ответ, похоже, просто перечисляет все файлы

Noel Kennedy 01.07.2011 16:14

У меня не работает, дает: Unmatched ) in regex; marked by <-- HERE in m/(?&lt;!WIN) <-- HERE \n/ at -e line 1.

moshen 13.05.2013 23:24

вам необходимо заменить & lt; с <

Joseph 15.01.2014 15:14

Символ < был испорчен при предыдущем редактировании. Я исправил это сейчас.

Cheran Shunmugavel 01.04.2014 08:29

Когда вы знаете, какие файлы имеют окончания строки Windows (0x0D 0x0A или \r \n), что вы будете делать с этими файлами? Я полагаю, вы конвертируете их в концы строк Unix (0x0A или \n). Вы можете преобразовать файл с окончанием строки Windows в окончания строки Unix с помощью утилиты sed, просто используйте команду:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

Вы можете поместить это в скрипт следующим образом:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

Если вы запустите его из корневого каталога с файлами, в конце вы будете уверены, что все файлы имеют окончание строки Unix.

Вот самый надежный ответ. Ответ Stimms не учитывает подкаталоги и двоичные файлы

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print  }'
  • Используйте file, чтобы найти тип файла. Те, у кого есть CRLF, имеют символы возврата Windows. Вывод file ограничен :, и первое поле - это путь к файлу.

Действительно самый безотказный способ. Чтобы преобразовать только все найденные файлы, просто запустите find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print }' | xargs flip -ub.

pixelbrackets 24.01.2017 12:36

В большинстве случаев это не безопасно - file не всегда даже сообщает "CRLF" в своем выводе, это зависит от типа файла. Я обнаружил, что для файлов SVG, содержащих текст, очень похожих на файлы с открытым текстом, file не упоминает тип используемого окончания строки. Таким образом, этот сценарий не зависит от типа файла. Просто говорю. В остальном выглядит разумным однострочником, без учета вышеупомянутых ограничений.

amn 16.04.2017 15:51

Другие вопросы по теме