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

awk 'BEGIN{print "Pricerange\tpricerangecount"}
     NR>1 {cur=int($0/10000); A[cur]+=1; if (cur>m) m=cur; }
     END {for(i=0;i<=m;i++) printf("%d-%d:\t%d\n",i*10000, (i+1)*10000, A[i])}' 
28
23.05.2017, 14:33
7 ответов

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

unix2dos file

Обратите внимание, что эта реализация не будет вставлять CR перед каждым LF, только до тех LFs, которым еще не предшествует один (и только один) 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
37
27.01.2020, 19:39

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

$ unix2dos file.txt

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

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

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

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

9
27.01.2020, 19:39

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

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

С ее помощью вы можете делать:

u2dos file >dosfile
1
27.01.2020, 19:39

В 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}'
1
27.01.2020, 19:39

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

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

  • POSIX Awk действительно поддерживает \ r и \ 15 , однако параметр -i inplace не является POSIX

  • d2u и dos2unix не является утилитами POSIX , а ex is

  • POSIX ex не поддерживает \ 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
2
27.01.2020, 19:39

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

$ vim my-file

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

:set ff=dos

или

:set fileformat=dos

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

Чтобы записать файл и выйти из редактора, используйте

:wq

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

$ vi +':w ++ff=dos' +':q' my-file
2
27.01.2020, 19:39

Вы можете использовать команду GNU sed:

 sed -i 's/$/\x0D/g' file.txt
  • $-регулярное выражение для конца строки

  • \x0D-шестнадцатеричное значение возврата каретки в ASCII

~] cat -v file.txt  
line1
line2
line3
line4

~] sed -i 's/$/\x0D/g' file.txt

~] cat -v file.txt             
line1^M
line2^M
line3^M
line4^M
-1
24.11.2020, 11:24

Теги

Похожие вопросы