Как преобразовать новую строку DOS / Windows (CRLF) в новую строку Unix (LF) в сценарии Bash? - PullRequest
298 голосов
/ 10 апреля 2010

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

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

Ответы [ 23 ]

6 голосов
/ 04 сентября 2014

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

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

Технически «1» - это ваша программа, b / c awk требует ее при данной опции. UPDATE : После повторного посещения этой страницы впервые за долгое время я понял, что никто еще не опубликовал внутреннее решение, поэтому вот одно: while IFS= read -r line; do printf '%s\n' "${line%$'\r'}"; done < dos.txt > unix.txt

4 голосов
/ 21 июля 2017

интересно в моем 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 на выходе.

3 голосов
/ 23 июня 2017

Просто задумался над тем же вопросом (на стороне 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'-формате, то есть с их исходными именами (но с LF-окончаниями), предлагая перезаписать локальные исходные файлы, если таковые имеются.

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

zip --help
...
-l   convert LF to CR LF (-ll CR LF to LF)
3 голосов
/ 13 марта 2015

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

tr "\r" "\n" < sampledata.csv > sampledata2.csv 
2 голосов
/ 20 мая 2014

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

brew install dos2unix

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

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

2 голосов
/ 13 июля 2018

В Linux легко конвертировать ^ M (ctrl-M) в * nix переводы строк (^ 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
2 голосов
/ 31 мая 2016

TIMTOWTDI!

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

На основе @ GordonDavisson

Нужно учитывать возможность [noeol] ...

1 голос
/ 07 ноября 2016

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

awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt
0 голосов
/ 12 февраля 2019

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

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

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

0 голосов
/ 18 октября 2018
sed --expression='s/\r\n/\n/g'

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

...