Як додати декларацію про перевезення перед кожною новою лінією?


28

У мене є файл, який використовується лише \nдля нових рядків, але мені він потрібен \r\nдля кожного нового рядка. Як я можу це зробити?

Наприклад, я вирішив це у Vim за допомогою :%s/\n/\r\n/g, але я хотів би використовувати сценарій або додаток командного рядка. Будь-які пропозиції?

Я спробував розібратися з цим sedабо grep, але мене негайно заплутав обхідний шлях обходу (я трохи зелений з цими командами).

Якщо ви зацікавлені, заявка пов'язана з моїм запитанням / відповіддю тут

Відповіді:


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

Зауважте, що unix2dox не буде вставляти a CRперед кожним LF, лише перед тими LF, яким вже не передує одна (і лише одна) CR.
Stéphane Chazelas

@ 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команди навколо , а також.
Stéphane Chazelas

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

дякую за пояснення всіх кроків - для новачків це набагато простіше зрозуміти, що відбувається.
користувач3616725

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

1

Ви можете спробувати

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}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.