Как преобразовать DOS или Windows перевод строки (возврата каретки и перевода строки) в Unix перевод строки (LF) в bash-скрипт?

Как преобразовать DOS или Windows перевод строки (возврата каретки и перевода строки) в Unix перевод строки (LF) в bash-скрипт?

10.04.2010 07:03:34 Просмотров 230 Источник

Как я могу программно (то есть, не используя vi) преобразовать DOS/Windows newlines в Unix?

Команды dos2unixи unix2dosнедоступны в некоторых системах. Как я могу эмулировать их с помощью таких команд, как sed/ awk/ tr?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script#comment40064446_2613800
Если вы можете выполнить компиляцию в целевую систему, вы можете попробовать github.com/mdolidon/endlines ; он сделан, чтобы быть довольно портативным.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script#comment86270894_2613800
Согласен! @BradKoch просто как "brew install dos2unix" на Mac OSX

Ответы - Как преобразовать DOS или Windows перевод строки (возврата каретки и перевода строки) в Unix перевод строки (LF) в bash-скрипт? / How to convert DOS/Windows newline (CRLF) to Unix newline (LF) in a Bash script?

codaddict

10.04.2010 07:09:28

Используя AWK вы можете сделать:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt

Используя Perl вы можете сделать:

perl -pe 's/\r$//' < dos.txt > unix.txt
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613817#comment45834557_2613817
Хорошее, портативное решение awk.
Jonathan Leffler

10.04.2010 07:13:36

Вы можете использовать trдля преобразования из DOS в Unix; однако вы можете сделать это безопасно только в том случае, если CR появляется в вашем файле только как первый байт пары байтов CRLF. Так обычно и бывает. Затем вы используете:

tr -d '\015' <DOS-file >UNIX-file

Обратите внимание, что имя DOS-fileотличается от имени UNIX-file; если вы попытаетесь использовать одно и то же имя дважды, вы не получите никаких данных в файле.

Вы не можете сделать это наоборот (со стандартным 'tr').

Если вы знаете, как ввести возврат каретки в скрипт (control-V, control-M для ввода control-M), то:

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

где '^M ' - это символ control-M. Вы также можете использовать механизм bashANSI-C Quoting для указания возврата каретки:

sed $'s/\r$//'     # DOS to Unix
sed $'s/$/\r/'     # Unix to DOS

Однако, если вам придется делать это очень часто (грубо говоря, несколько раз), гораздо разумнее установить программы преобразования (например dos2unixи unix2dos, или, возможноdtouи utod) и использовать их.

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment29764992_2613834
используя tr -d '\015' <DOS-file >UNIX-file , где DOS-file == UNIX-file просто результаты в пустой файл. К сожалению, выходной файл должен быть другим файлом.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment29765094_2613834
@ButtleButkus: Ну да, именно поэтому я использовал два разных имени. Если вы закроете входной файл до того, как программа прочитает его все, как вы делаете, когда вы используете одно и то же имя дважды, вы получите пустой файл. Это единообразное поведение в Unix-подобных системах. Для безопасной перезаписи входного файла требуется специальный код. Следуйте инструкциям, и все будет в порядке.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment29765282_2613834
Я, кажется, помню, что функция поиска в файле-замена где-то была.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment29765379_2613834
Есть места, и вы должны знать, где их найти. В рамках ограничений sed(для in-place); ограничения представляют собой связанные файлы и символические ссылки. Команда -i"всегда" (с 1979 года, если не раньше) поддерживает опциюsort, которая может выводить список одного из входных файлов. Однако отчасти это связано с тем, что -oдолжен прочитать все свои входные данные, прежде чем он сможет записать любой из своих выходных данных. Другие программы периодически поддерживают перезапись одного из своих входных файлов. Вы можете найти программу общего назначения (скрипт), чтобы избежать проблем в "среде программирования UNIX" Kernighan & Pike.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment42724575_2613834
Третий вариант меня устроил, спасибо. Я использовал опцию-i: sed -i $'s/\r$//' filename-для редактирования на месте. Я работаю на машине, которая не имеет доступа к интернету, поэтому установка программного обеспечения является проблемой.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment61322420_2613834
Вот как это сделать, не меняя имя файла: tr -d '\015' < original_file > t && mv t original_file- в основном работает, создавая временный файл, а затем перезаписывая им старый.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment66290175_2613834
@JonathanLeffler к вашему сведению, для пользователей macOS: sedне делает (по умолчанию, не уверен, что вы можете это изменить?) признать сбежал версий \r, \015, \x0d для возврата каретки; sed признает КЛ при вводе с ctrl-v ctrl-m , как описано выше (
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment73097240_2613834
@ JonathanLeffler универсальная программа называется spongeи может быть найдена в более удобном формате : tr -d '\015' < original_file | sponge original_file. Я пользуюсь им ежедневно.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment95582460_2613834
Как сделать это рекурсивно?
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613834#comment95625289_2613834
@AaronFranke: это зависит от того, как выглядит ваш сценарий. В моей книге, Если вам нужно изменять кучу файлов таким же образом, вы используете скрипт для инкапсуляции обработки (даже если вы его выбросить после того, как вы закончили), а затем использовать такой инструмент, как find , чтобы определить файлы, которые нужно изменить (или создать список имен файлов — один надеется, что они не должны содержать пробелов и прочих непокорных препинания в названиях), а затем применить скрипт в архиве. Используя find … -exec sh script.sh {} + является довольно эффективным. Альтернатив-легион. Техника findработает с абсурдными именами.
ghostdog74

10.04.2010 07:21:05

tr -d "\r" < file

посмотрите здесь примеры использования sed:

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'               # assumes that all lines end with CR/LF
sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/"            # command line under ksh
sed 's/$'"/`echo \\\r`/"             # command line under bash
sed "s/$/`echo \\\r`/"               # command line under zsh
sed 's/$/\r/'                        # gsed 3.02.80 or higher

Используйте sed -iдля преобразования на месте, например sed -i 's/..../' file.

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613853#comment4567246_2613853
Я использовал вариант, так как мой файл только \r : tr "\r" "\n" < infile > outfile
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613853#comment28691999_2613853
@MattTodd не могли бы вы опубликовать это в качестве ответа? -dиспользуется чаще и не поможет в ситуации "только \r".
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613853#comment35833421_2613853
Обратите внимание, что предложенное \r\nимеет эффект двойного интервала между файлами; каждая отдельная строка CRLF, заканчивающаяся в DOS, становится \n\nв Unix.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2613853#comment95582467_2613853
Могу ли я сделать это рекурсивно?
Gordon Davisson

10.04.2010 09:50:06

Решения, опубликованные до сих пор, касаются только части проблемы , преобразования CRLF DOS/Windows в LF Unix; часть, которую они упускают, состоит в том, что DOS использует CRLF в качестве разделителя строк, в то время как Unix использует LF в качестве Терминатора строк . Разница в том, что файл DOS (обычно) не будет иметь ничего после последней строки в файле, в то время как Unix будет. Чтобы правильно провести конвертацию, вам необходимо добавить этот final LF (если только файл не имеет нулевой длины, т. е. в нем вообще нет строк). Мое любимое заклинание для этого (с небольшой добавленной логикой для обработки файлов, разделенных CR в стиле Mac, а не файлов, которые уже находятся в формате unix) - это немного perl:

perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt

Обратите внимание, что это отправляет Unixified версию файла в stdout. Если вы хотите заменить файл на Unixified версию, добавьте флаг perl-i.

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2614296#comment57667658_2614296
@LudovicZenohateLagouardette был ли это обычный текстовый файл (например, csv или текст с табуляцией) или что-то еще? Если он был в каком-то формате базы данных, манипулирование им, как если бы это был текст, очень вероятно, повредит его внутреннюю структуру.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2614296#comment57676558_2614296
Обычный текстовый csv, но я думаю, что enconding был странным. Я думаю, что из-за этого все пошло наперекосяк. Однако не волнуйтесь. Я всегда собираю резервные копии, и это даже не настоящий набор данных, а всего лишь 1 ГБ. Настоящий - это 26 ГБ.
Norman Ramsey

11.04.2010 02:32:46

Эта проблема может быть решена с помощью стандартных инструментов, но есть достаточно много ловушек для неосторожных, что я рекомендую вам установить команду flip, которая была написана более 20 лет назад Рахулом Дхеси, автором zoo. Он отлично справляется с преобразованием форматов файлов, например, избегая непреднамеренного уничтожения двоичных файлов, что немного слишком легко, если вы просто гоняетесь вокруг изменения каждого CRLF, который вы видите...

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2615257#comment30548448_2615257
Есть ли способ сделать это потоковым способом, не изменяя исходный файл?
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2615257#comment39582750_2615257
@augurar вы можете проверить "похожие пакеты" packages.debian.org/wheezy/flip
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/2615257#comment91576461_2615257
У меня был опыт взлома половины моей ОС, просто запустив texxto с неправильным флагом. Будьте осторожны, особенно если вы хотите сделать это на целых папках.
mercergeoinfo

10.09.2013 05:08:27

Я пытался sed' s/^M$// ' файл.формат txt на OSX, а также несколько других методов ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing-dos-line-endings или http://hintsforums.macworld.com/archive/index.php/t-125.html ). никто не работал, файл оставался неизменным (кстати Ctrl-v Enter был необходим для воспроизведения ^M). В конце концов я использовал TextWrangler. Это не совсем командная строка, но она работает и не жалуется.

anatoly techtonik

31.10.2013 01:40:43

Если у вас нет доступа к dos2unix, но вы можете прочитать эту страницу, то вы можете скопировать / вставить dos2unix.py отсюда.

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

Кросс-пост от суперпользователя .

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/19702943#comment50486849_19702943
Использование вводит в заблуждение. Реальный dos2unixпреобразует все входные файлы по умолчанию. Ваше использование подразумевает -n-это фильтр, который читает из stdin, записывает в stdout, если файлы не заданы.
Steven Penny

30.04.2014 02:02:31

Делать это с POSIX сложно:

  • POSIX Sed не поддерживает \rили \15. Даже если и так, то на месте option-iне является POSIX

  • POSIX Awk поддерживает \rи \15, однако опция-i inplace это не POSIX

  • d2u и dos2unix-это не утилиты POSIX, а ex

  • POSIX ex не поддерживает \r, \15, \nили \12

Чтобы удалить возврат каретки:

ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file

Чтобы добавить возврат каретки:

ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/23385171#comment72136523_23385171
Похоже, POSIX trподдерживает \r. Так что вы можете также использовать printf '%s\n' '%!tr -d "\r"' x | ex file(хотя и разрешено, это удалено \r, даже если не непосредственно предшествует \n). Кроме того, параметр-bдля exне указан в POSIX.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/23385171#comment89755856_23385171
Сделать это в POSIX очень просто. Добавьте литерал CR в сценарий, введя его (это control-M).
Ashley Raiteri

20.05.2014 03:25:59

Для Mac osx, если у вас установлен homebrew [ http://brew.sh/][1]

brew install dos2unix

for csv in *.csv; do dos2unix -c mac ${csv}; done;

Убедитесь, что вы сделали копии файлов, так как эта команда изменит файлы на месте. Опция-C для Mac делает переключатель для совместимости с OSX.

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/23748717#comment45108281_23748717
Этот ответ действительно не соответствует вопросу оригинального плаката.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/23748717#comment60844648_23748717
Пользователи OS X не должны использовать-c mac, который предназначен для преобразования CRCR. Вы хотите использовать этот режим только для файлов на Mac OS 9 и выше.
nawK

04.09.2014 04:16:46

Еще более простое решение awk без программы:

awk -v ORS='\r\n' '1' unix.txt > dos.txt

Технически "1" - это ваша программа, b/c awk требует одного, когда дается опция.

Обновление: После повторного просмотра этой страницы в первый раз за долгое время я понял, что никто еще не опубликовал внутреннее решение, так что вот один:

while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/25655502#comment45834903_25655502
Это удобно, но просто для ясности: это переводит Unix - > Windows / DOS, что является > противоположным направлением того, что просил OP.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/25655502#comment45855400_25655502
Это было сделано специально, оставлено как упражнение для автора. eyerolls awk -v RS='\r\n' '1' dos.txt > unix.txt
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/25655502#comment45855576_25655502
Отлично (и хвала вам за педагогическую тонкость).
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/25655502#comment45855597_25655502
"б/у awk требуется при данной опции.- awk всегда требует наличия программы, независимо от того, указаны параметры или нет.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/25655502#comment45856609_25655502
Чистое решение bash интересно, но гораздо медленнее, чем эквивалентное awkили sed. Кроме того, вы должны использовать while IFS= read -r line, чтобы точно сохранить входные строки, иначе начальные и конечные пробелы будут обрезаны (в качестве альтернативы, не используйте имя переменной в команде readи работайте с $REPLY).
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/25655502#comment48514907_25655502
Почему четкими командами? Если Вы читаете в одну переменную (или нет, и неявно $READ), чтение просто разбивается на концовки строк, и вы можете просто использовать echo вместо printf (echo, скорее всего, будет встроенным, и это обычно быстрее). Итак, используя ctrl-v+ctrl-m для ввода \r, можно просто сделать while read -r; do echo "${REPLY%^M}"; done < file > file.fixed, и это примерно та же скорость, что и sed.
Santosh

13.03.2015 01:36:01

Это сработало для меня.

tr "\r" "\n" < sampledata.csv > sampledata2.csv 
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/29021594#comment51530291_29021594
Это будет конвертировать каждый один Дос-строки в двух ОС UNIX переводы строк.
ThorSummoner

30.07.2015 08:38:45

Супер пупер легко с PCRE;

Как скрипт, или замените $@вашими файлами.

#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@

Это перезапишет ваши файлы на месте!

Я рекомендую делать это только с резервной копией (контроль версий или иначе)

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/31730531#comment80323592_31730531
Спасибо! Это работает, хотя я пишу имя файла и не -- Я выбрал это решение, потому что его легко понять и адаптировать для меня. К вашему сведению, это то, что делают коммутаторы: -pпринимает цикл" while input", -iредактирует входной файл на месте, -eвыполняет следующую команду
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/31730531#comment80888445_31730531
Строго говоря, PCRE-это реимплементация движка регулярных выражений Perl, а не движка регулярных выражений Perl. Они оба обладают этой способностью, хотя есть и различия, несмотря на импликацию в названии.
lzc

31.05.2016 08:15:38

TIMTOWTDI!

perl -pe 's/\r\n/\n/; s/([^\n])\z/$1\n/ if eof' PCfile.txt

По материалам @GordonDavisson

Нужно рассмотреть возможность [noeol]...

kazmer

07.11.2016 02:30:31

Вы можете использовать awk. Установите разделитель записей ( RS) в регулярное выражение, которое соответствует всем возможным символам новой строки или символам. И установите разделитель выходных записей (ORS) на символ новой строки в стиле unix.

awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/40455759#comment72191105_40455759
Это тот, который работал для меня (MacOS, git diffshows ^M, отредактировано в vim)
Gannet

24.01.2017 11:38:29

Как расширение для решения Unix to DOS Джонатана Леффлера, чтобы безопасно конвертировать в DOS, когда вы не уверены в текущих окончаниях строк файла:

sed '/^M$/! s/$/^M/'

Это проверяет, что строка еще не заканчивается в CRLF перед преобразованием в CRLF.

vmsnomad

23.06.2017 09:37:19

Пришлось просто задуматься над тем же вопросом (на стороне Windows, но в равной степени применимо и к linux.) Удивительно, что никто не упомянул об очень автоматизированном способе преобразования CRLF< - >LF для текстовых файлов, использующем старый добрый zip -ll(Info-ZIP):

zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip 

Примечание: это создаст zip-файл с сохранением исходных имен файлов, но преобразованием окончаний строк в LF. Затем unzipизвлекает файлы в виде zip'Ed, то есть с их оригинальными именами (но с LF-окончаниями), таким образом предлагая перезаписать локальные исходные файлы, если таковые имеются.

Соответствующая выдержка из zip --help:

zip --help
...
-l   convert LF to CR LF (-ll CR LF to LF)
user829755

21.07.2017 12:21:05

интересно, что в моем git-bash на windows sed ""уже сделали свое дело:

$ echo -e "abc\r" >tst.txt
$ file tst.txt
tst.txt: ASCII text, with CRLF line terminators
$ sed -i "" tst.txt
$ file tst.txt
tst.txt: ASCII text

Я предполагаю, что sed игнорирует их при чтении строк из ввода и всегда записывает окончания строк unix на выходе.

jet

13.07.2018 04:43:14

В Linux легко конвертировать ^M (ctrl-M) в * Nix newlines (^J) с помощью sed.

Это будет что-то вроде этого на CLI, там на самом деле будет разрыв строки в тексте. Однако \ передает это ^J вместе с sed:

sed 's/^M/\
/g' < ffmpeg.log > new.log

Вы получите это с помощью ^V (ctrl-V), ^M (ctrl-M) и \ (обратная косая черта) при вводе:

sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/51326591#comment100175301_51326591
это то, что сработало для меня, спасибо!
Boris

18.07.2018 03:34:31

Для преобразования файла на месте используйте

dos2unix <filename>

Для вывода преобразованного текста в другой файл используйте

dos2unix -n <input-file> <output-file>

Вы можете установить его на Ubuntu или Debian с

sudo apt install dos2unix

или на macOS с использованием homebrew

brew install dos2unix
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/51391922#comment100001783_51391922
Я знаю, что вопрос требует альтернатив dos2unix, но это первый результат google.
Johan Zicola

31.08.2018 01:03:11

Vim можно использовать программно с помощью команды option-c {} :

Dos в Unix:

vim file.txt -c "set ff=unix" -c ":wq"

Unix to dos:

vim file.txt -c "set ff=dos" -c ":wq"

"set ff=unix / dos" означает изменение fileformat (ff) файла на Unix / DOS формат конца строки

": wq " означает запись файла на диск и выход из редактора (что позволяет использовать команду в цикле)

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/52113051#comment96456488_52113051
Это казалось самым элегантным решением, но отсутствие объяснения того, что означает wq, вызывает сожаление.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/52113051#comment96573549_52113051
Любой, кто использует vi, будет знать, что означает: wq. Для тех, кто этого не делает, 3 символа означают 1) Открыть командную область vi, 2) написать и 3) выйти.
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/52113051#comment97738855_52113051
Я понятия не имел, что вы можете интерактивно добавлять команды в vim из CLI
https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/52113051#comment100348896_52113051
вы можете использовать": x "вместо": wq"
John Paul

18.10.2018 05:51:19

sed --expression='s/\r\n/\n/g'

Поскольку в вопросе упоминается sed, это самый прямой способ использовать sed для достижения этой цели. Выражение говорит следующее: замените все возвраты каретки и перевод строки только на перевод строки. Это то, что вам нужно, когда вы переходите от Windows к Unix. Я проверил, что это работает.

https://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-lf-in-a-bash-script/52876791#comment92680355_52876791
Эй, Джон Пол-этот ответ был помечен для удаления, поэтому он появился в очереди на просмотр для меня. В общем, когда у вас есть такой вопрос, которому 8 лет, с 22 ответами, вы захотите объяснить, как ваш ответ полезен, а другие существующие ответы-нет.
OZZIE

12.02.2019 12:48:08

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

convert-crlf-to-lf() {
    file="$1"
    tr -d '\015' <"$file" >"$file"2
    rm -rf "$file"
    mv "$file"2 "$file"
}

просто убедитесь, что у вас есть файл типа "file1.txt "that" file1.txt2 " еще не существует или будет перезаписан,я использую его как временное место для хранения файла.

Помочь в развитии проекта:
Закрыть X