Преобразование всех CR в CRLF в текстовом файле с помощью CMD

есть ли способ конвертировать все CRs в CRLFs в текстовом файле?

когда я открываю текстовый файл с сервера Linux в Windows, весь текст отображается в одной строке, но на самом деле это многострочный.

Я хотел бы выполнить преобразование в пакетном файле.

может кто-нибудь совет, пожалуйста?

6 ответов


линейные сепараторы и линейные Терминаторы были источником трения совместимости между системами, пока было более одного вида системы и желание обмениваться данными. The статья Википедии о новой строке имеет достойный обзор исторического контекста. И он предлагает различные решения этой проблемы специально для использования на стороне Unix или на стороне Windows.

на стороне Unix (Linux) найдите утилиту с именем unix2dos и его близкий родственник dos2unix. Они обычно доступны либо как компонент коммерческого Unix, либо как инструменты с открытым исходным кодом. Если они доступны, они являются лучшим ответом, потому что они (как правило, см. man-страницы вашего verson для деталей) осторожны с файлами, которые случайно написаны с обоими окончаниями строк. В этом неудачном случае поездка через обе утилиты обычно очищает файл, чтобы быть внутренне согласованным. В отсутствие этих удобных команд, многие собственные утилиты могут быть сделаны чтобы сделать преобразование. Например, преобразование окончаний строк DOS CRLF в новые строки Unix можно сделать с помощью tr команда:

$ tr -d '\r' < inputfile > outputfile

но обратите внимание, что эта команда предполагала, что все строки были завершены CRLF (или LFCR) и работают, просто удаляя каждый символ CR из входных данных. Любые голые символы CR будут потеряны.

на стороне DOS и Windows это было намного мрачнее. Порты unix2dos и dos2unix конечно, существуют, например, они включены в много большие инструменты Cygwin, которые обеспечивают полную эмуляцию unix на машине Windows. Но решение, использующее только встроенные функции, было трудно найти.

современные окна (возможно, начиная с Windows XP), Однако, лучше. Там встроенная команда FIND гораздо менее чувствительна к выбору line terminator, чем раньше, и может использоваться для выполнения необходимого преобразования из окончаний строк Unix в окончания DOS. Страницы Вики привел выше дает рецепт:

C:\...> TYPE filename.u | FIND "" /V >filename.txt

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

C:\...> FIND "" /V <filename.u >filename.txt

в обоих случаях создается копия файла с измененными окончаниями строк. Вероятно, не рекомендуется менять файлы на месте.

я упомяну еще один подход, который всегда кажется заманчивым на бумаге. При использовании Samba для предоставления общего ресурса файловой системы на сервере Linux для установки Windows, существует опция конфигурации, которую вы можете установить для общего ресурса, который монтирует его в"текстовом режиме". Акции, смонтированные в" текстовом режиме", автоматически преобразуют окончания строк. Если это работает для вас, это, вероятно, самое чистое возможное решение. Обе системы используют предпочтительный формат текстового файла, и ни одна из них не должна беспокоиться об этом. Но проверьте внимательно, это решение полно крайних случаев и подводных камней. Самое главное, не ожидайте, что двоичные файлы в точке монтирования файловой системы текстового режима будут правильно прочитаны. Они часто, но не всегда.


type inputfile | find /v "" > outputfile

Это должно сделать это. type считывает входной файл и выводит каналы в find с параметрами для соответствия всем строкам и вывода их в выходной файл. В этом процессе LF преобразуется в CRLF


cat file | perl -pe 's/\R/\n/g'

в Windows XP и более ранних версиях вы можете конвертировать текстовый файл в CRLF, просто открыв и сохранив его в Dos Edit (или Windows Edit). К сожалению, программа редактирования была удалена в Vista.


один нелепый способ. Работает со следующими сценариями:

  1. текстовый файл с CR в конце каждой строки.
  2. текстовый файл с повторяющимся набором CR в конце строки, за которым следует пустая строка с CRLF. Удачи!

откройте файл в Notepad++ (бесплатное приложение) и установите View -> все символы.

Если все строки заканчиваются на CR, то:

  1. откройте в Microsoft Wordpad-NOT-Word и сохраните файл в Формате MSDOS. Иначе, если строки заканчиваются на CR, а затем пустой строкой, заканчивающейся CRLF, то
  2. удалить пустые строки в Notepad++. Перейдите в меню Правка - > операции с линиями - > удалить пустые строки и сохраните файл.
  3. откройте файл в Microsoft Wordpad и сохраните его в формате MSDOS.

КОНЕЦ ЕСЛИ


следующий фрагмент пакета делает трюк:

del outputfile
for /f "delims=" %%x in (inputfile) do echo %%x>>outputfile

его преимущество не полагается на find программа, которая довольно темпераментна (зависает или не работает на некоторых машинах, где я тестировал другие решения).