Как добавить возврат каретки перед каждым переводом строки?

28

У меня есть файл, который используется только \nдля новых строк, но мне нужно, чтобы он был \r\nдля каждой новой строки. Как я могу это сделать?

Например, я решил это с помощью Vim :%s/\n/\r\n/g, но я хотел бы использовать скрипт или приложение командной строки. Какие-либо предложения?

Я попытался найти это с помощью sedили grep, но меня сразу смутили обходные пути escape-последовательности (я немного зелен от этих команд).

Если интересно, заявка связана с моим вопросом / ответом здесь

modulitos
источник

Ответы:

36

Вы можете использовать unix2dos (который находится в Debian):

unix2dos file

Обратите внимание , что эта реализация не будет вставить CRперед каждым LF, только до тех LFс, которые уже не предшествует один (и только один) CRи пропустят двоичные файлы (те , которые содержат значение байт в 0x0 -> 0x1F диапазоне, кроме LF, FF, TABили CR).

или используйте sed:

CR=$(printf '\r')
sed "s/\$/$CR/" file

или используйте awk:

awk '{printf "%s\r\n", $0}' file

или используйте perl:

perl -pe 's|\n|\r\n|' file
cuonglm
источник
Обратите внимание, что unix2dox не будет вставлять CRперед каждым LF, только перед теми LF, которым еще не предшествует один (и только один) CR.
Стефан Шазелас
@ StéphaneChazelas: Спасибо за пункт, добавил его в мой ответ.
cuonglm
1
Ключевая информация для меня здесь использовалась '\r'с sedтрюком.
rkersh
8

Это именно то, что unix2dosделает:

$ unix2dos file.txt

Это заменит file.txtна месте версию с окончанием строки CRLF.

Если вы хотите сделать это sed, вы можете вставить возврат каретки в конце каждой строки:

sed -e 's/$/\r/' file.txt

Это заменяет ( s) область нулевого размера прямо перед концом строки ( $) на \r. Чтобы выполнить замену на месте (как это unix2dosделается), используйте sed -i.bak, хотя это нестандартное расширение - если у вас его нет, используйте временный файл.

Майкл Гомер
источник
3
Использование \rв замен не является портативным. По крайней мере, это не будет работать в Mac OSX.
Cuonglm
Обратите внимание, что существует несколько реализаций unix2dos. Возможно, вы захотите дать ссылку на домашнюю страницу конкретной реализации (например, waterlan.home.xs4all.nl/dos2unix.html, как в Debian) вместо linux.die.net/man, которая не дает понять, какая реализация (или версия) документирована. Обратите внимание , что есть некоторые u2d, ux2dos, todosкоманды вокруг , а также.
Стефан Шазелас
2

Если вы выполняете преобразование на компьютере с Unix (OS X, Linux), откройте файл с помощью viили vim:

$ vim my-file

нажмите клавишу ESC, чтобы убедиться, что вы не находитесь в режиме вставки, затем введите

:set ff=dos

или

:set fileformat=dos

Это делает преобразование на месте, устанавливая формат файла.

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

:wq

В командной строке вы можете сделать

$ vi +':w ++ff=dos' +':q' my-file
Питер Эванс
источник
спасибо за объяснение всех шагов - для новичка намного легче понять, что происходит.
user3616725
2

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

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

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

  • d2u и dos2unix не POSIX утилит , но бывший есть

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

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

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

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

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
Стивен Пенни
источник
1

Переносимая функция оболочки, которая сделает это:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

С этим вы можете сделать:

u2dos file >dosfile
mikeserv
источник
1

В awk вы можете попробовать

awk '{print $0 "\r"}'

Или

awk -v r=$'\r' '{print $0 r}'

$'\r'Является примером стиля ANSI-C процитировать , как поддерживается несколькими оболочками , как ksh93, bash, zsh, mkshи FreeBSD , sh и , вероятно, будут включены в выпуске 8 спецификации Single Unix .

Он предлагает общий способ выражения странных символов, попробуйте это, например:

awk -v r=$'\U0001F608' '{print $0 r}'
trepanger
источник