Преобразование форматирования новой строки из Mac в Windows

133

Мне нужна утилита / сценарий преобразования, который преобразует файл дампа .sql, созданный на Mac, в файл, читаемый в Windows. Это продолжение проблемы я имел здесь . Проблема, похоже, связана с форматированием новой строки в текстовых файлах, но я не могу найти инструмент для преобразования ...

Ярина
источник
3
Универсальный инструмент, который я сделал после того, как не нашел удовлетворительного решения с промышленной мощью github.com/mdolidon/endlines
Матиас Долидон

Ответы:

134

Windows использует carriage return+ line feedдля новой строки:

\r\n

Unix использует только Line feedдля новой строки:

\n

В заключение просто замените каждое появление \nна \r\n.
Оба unix2dosи dos2unixпо умолчанию недоступны в Mac OSX.
К счастью, вы можете просто использовать Perlили sedдля выполнения работы:

sed -e 's/$/\r/' inputfile > outputfile                # UNIX to DOS  (adding CRs)
sed -e 's/\r$//' inputfile > outputfile                # DOS  to UNIX (removing CRs)
perl -pe 's/\r\n|\n|\r/\r\n/g' inputfile > outputfile  # Convert to DOS
perl -pe 's/\r\n|\n|\r/\n/g'   inputfile > outputfile  # Convert to UNIX
perl -pe 's/\r\n|\n|\r/\r/g'   inputfile > outputfile  # Convert to old Mac

Фрагмент кода из:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities

Энн
источник
36
Команда sedдля UNIX to DOS не работает для меня в OS X Lion - она ​​просто вставляет текст «r» в конце каждой строки. perlКоманда работает , хотя.
Ergwun
7
OSX использует старую версию sed. Я использую Homebrew для OSX и установил gnu-sed. Вы используете с командой «gsed» вместо «sed». Это работает.
Джон
2
Вместо этого используйте Homebrew, чтобы получить пакеты dos2unix и unix2dos.
Пратюш
10
OS X Yosemite по-прежнему имеет ту же проблему sed, но вы можете обойти ее, не устанавливая Homebrew, gnu-sed или unix2dos: используйте sed -e 's/$/^M/' inputfile > outputfile, где ^M- управляющий символ, созданный в командной строке через Ctrl+V Ctrl+M.
LarsH 05
2
Другой обходной путь для Mac OS (протестирован на 10.13.6 High Sierra): поставьте $перед одинарной кавычкой, содержащей команду sed: sed $'s/\r$//'Пояснение: bash декодирует экранирование обратной косой черты в $'...'строках. Подробнее см. Gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html .
jcsahnwaldt Reinstate Monica
127

Это улучшенная версия ответа Анны - если вы используете perl, вы можете редактировать файл «на месте», а не создавать новый файл:

perl -pi -e 's/\r\n|\n|\r/\r\n/g' file-to-convert  # Convert to DOS
perl -pi -e 's/\r\n|\n|\r/\n/g'   file-to-convert  # Convert to UNIX
JosephH
источник
5
В этих сценариях замечательно то, что они показывают с помощью регулярных выражений ТОЧНО, каким должно быть преобразование в конце строки для преобразования в любой формат, начиная с чего угодно.
pbr
будьте осторожны с этим при определенных установках Cygwin / git bash в системах Windows. Это может дать вам Can't do inplace edit on file: Permission denied.и удалить файл. Вместо этого поищите другие утилиты.
Деннис
Огромное спасибо за то, что показали «Преобразовать в Unix». Я был за этим путем, и ваш двойной ответ помог мне и получил мою поддержку.
null
112

Вы можете установить unix2dos с Homebrew

brew install unix2dos

Тогда вы можете сделать это:

unix2dos file-to-convert

Вы также можете конвертировать файлы dos в unix:

dos2unix file-to-convert
Стивен Хирлстон
источник
9
Для всех, кто сталкивается с этим сейчас, теперь называется формула Homebrew dos2unix. Вы захотите brew install dos2unix.
Джефф
13
Собственно либо brew install unix2dosлибо brew install dos2unixнормально работает. Они устанавливают один и тот же пакет. Используйте то имя, которое вам
подходит
2
Или с MacPorts : port install dos2unix.
Fang
16

Вероятно, вам нужен unix2dos :

$ man unix2dos

NAME
       dos2unix - DOS/MAC to UNIX and vice versa text file format converter

SYNOPSIS
           dos2unix [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]
           unix2dos [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]

DESCRIPTION
       The Dos2unix package includes utilities "dos2unix" and "unix2dos" to convert plain text files in DOS or MAC format to UNIX format and vice versa.  Binary files and non-
       regular files, such as soft links, are automatically skipped, unless conversion is forced.

       Dos2unix has a few conversion modes similar to dos2unix under SunOS/Solaris.

       In DOS/Windows text files line endings exist out of a combination of two characters: a Carriage Return (CR) followed by a Line Feed (LF).  In Unix text files line
       endings exists out of a single Newline character which is equal to a DOS Line Feed (LF) character.  In Mac text files, prior to Mac OS X, line endings exist out of a
       single Carriage Return character. Mac OS X is Unix based and has the same line endings as Unix.

Вы можете запускать unix2dosна своем компьютере DOS / Windows с помощью cygwin или на своем Mac с помощью MacPorts .

Пол Р
источник
unix2dos / dos2unix не существует на моем Mac, и я не нашел места для их установки. Знаете ли вы об этом?
Ярин
@mgadda: +1 - да, я перешел на homebrew с MacPorts некоторое время назад и не оглядывался назад.
Paul R
15

Просто trудалите:

tr -d "\r" <infile.txt >outfile.txt
parahren
источник
1
Пробовал perl и sed, не сработало (я мог догадаться, не стоило пробовать). Это сработало отлично.
RandomInsano
Это было первое решение, которое я нашел, чтобы номера строк BBEdit не совпадали с количеством строк, когда я их читал с помощью Python (и не соответствовал wc -l).
Дэрил Спитцер
1
при этом удаляются все разрывы строк. Мне действительно нужны разрывы строк, но с \ n
UserYmY
На " hints.macworld.com/article.php?story=20031018164326986 " также есть хорошая запись о том, как использовать trкоманду для выполнения различных преобразований. Используйте hexdumpили подобное, чтобы узнать, какое именно соглашение о конце строки теперь используется в файле.
Майк Робинсон
6
  1. Установите dos2unix с помощью homebrew
  2. Выполнить, find ./ -type f -exec dos2unix {} \;чтобы рекурсивно преобразовать все окончания строк в текущей папке
AAverin
источник
2

vimтакже может конвертировать файлы из формата UNIX в формат DOS. Например:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF
Стивен Куан
источник
2

Ниже приведен полный сценарий, основанный на приведенных выше ответах вместе с проверкой работоспособности и работающий в Mac OS X, а также должен работать в других системах Linux / Unix (хотя это не было проверено).

#!/bin/bash

# http://stackoverflow.com/questions/6373888/converting-newline-formatting-from-mac-to-windows

# =============================================================================
# =
# = FIXTEXT.SH by ECJB
# =
# = USAGE:  SCRIPT [ MODE ] FILENAME
# =
# = MODE is one of unix2dos, dos2unix, tounix, todos, tomac
# = FILENAME is modified in-place
# = If SCRIPT is one of the modes (with or without .sh extension), then MODE
# =   can be omitted - it is inferred from the script name.
# = The script does use the file command to test if it is a text file or not,
# =   but this is not a guarantee.
# =
# =============================================================================

clear
script="$0"
modes="unix2dos dos2unix todos tounix tomac"

usage() {
    echo "USAGE:  $script [ mode ] filename"
    echo
    echo "MODE is one of:"
    echo $modes
    echo "NOTE:  The tomac mode is intended for old Mac OS versions and should not be"
    echo "used without good reason."
    echo
    echo "The file is modified in-place so there is no output filename."
    echo "USE AT YOUR OWN RISK."
    echo
    echo "The script does try to check if it's a binary or text file for sanity, but"
    echo "this is not guaranteed."
    echo
    echo "Symbolic links to this script may use the above names and be recognized as"
    echo "mode operators."
    echo
    echo "Press RETURN to exit."
    read answer
    exit
}

# -- Look for the mode as the scriptname
mode="`basename "$0" .sh`"
fname="$1"

# -- If 2 arguments use as mode and filename
if [ ! -z "$2" ] ; then mode="$1"; fname="$2"; fi

# -- Check there are 1 or 2 arguments or print usage.
if [ ! -z "$3" -o -z "$1" ] ; then usage; fi

# -- Check if the mode found is valid.
validmode=no
for checkmode in $modes; do if [ $mode = $checkmode ] ; then validmode=yes; fi; done
# -- If not a valid mode, abort.
if [ $validmode = no ] ; then echo Invalid mode $mode...aborting.; echo; usage; fi

# -- If the file doesn't exist, abort.
if [ ! -e "$fname" ] ; then echo Input file $fname does not exist...aborting.; echo; usage; fi

# -- If the OS thinks it's a binary file, abort, displaying file information.
if [ -z "`file "$fname" | grep text`" ] ; then echo Input file $fname may be a binary file...aborting.; echo; file "$fname"; echo; usage; fi

# -- Do the in-place conversion.
case "$mode" in
#   unix2dos ) # sed does not behave on Mac - replace w/ "todos" and "tounix"
#       # Plus, these variants are more universal and assume less.
#       sed -e 's/$/\r/' -i '' "$fname"             # UNIX to DOS  (adding CRs)
#       ;;
#   dos2unix )
#       sed -e 's/\r$//' -i '' "$fname"             # DOS  to UNIX (removing CRs)
#           ;;
    "unix2dos" | "todos" )
        perl -pi -e 's/\r\n|\n|\r/\r\n/g' "$fname"  # Convert to DOS
        ;;
    "dos2unix" | "tounix" )
        perl -pi -e 's/\r\n|\n|\r/\n/g'   "$fname"  # Convert to UNIX
        ;;
    "tomac" )
        perl -pi -e 's/\r\n|\n|\r/\r/g'   "$fname"  # Convert to old Mac
        ;;
    * ) # -- Not strictly needed since mode is checked first.
        echo Invalid mode $mode...aborting.; echo; usage
        ;;
esac

# -- Display result.
if [ "$?" = "0" ] ; then echo "File $fname updated with mode $mode."; else echo "Conversion failed return code $?."; echo; usage; fi
ECJB
источник
1

Вот действительно простой подход, который хорошо сработал для меня, любезно предоставленный блогом Дэви Шмейтс :

cat foo | col -b > foo2

Где foo - это файл с символами Control + M в конце строки, а foo2 - новый файл, который вы создаете.

patdevelop
источник
0

В Yosemite OSX используйте эту команду:

sed -e 's/^M$//' -i '' filename

где ^Mпоследовательность достигается нажатием Ctrl+ Vзатем Enter.

Ольга
источник
Также обратите внимание, что sed он понимает обратные \rкосые черты, такие как и `\ n`, и поэтому также может использовать их при замене. На самом деле вам не нужно вводить буквальный control-M, чтобы ссылаться на этот символ (или любой другой). Принцип использования sed-i) для любого преобразования такого рода очень хорош, потому что, в отличие от этого tr, вы не ограничены «одним символом за раз».
Майк Робинсон
0

Расширяя ответы Anne и JosephH, используя perl в коротком perl-скрипте, я слишком ленив, чтобы печатать perl-one-liner очень долго.
Создайте файл с именем, например, "unix2dos.pl" и поместите его в каталог на своем пути. Отредактируйте файл, чтобы он содержал 2 строки:

#!/usr/bin/perl -wpi
s/\n|\r\n/\r\n/g;

Предполагая, что "which perl" возвращает "/ usr / bin / perl" в вашей системе. Сделайте файл исполняемым (chmod u + x unix2dos.pl).

Пример:
$ echo "hello"> xxx
$ od -c xxx (проверка того, что файл заканчивается на nl)
0000000 hello \ n

$ unix2dos.pl xxx
$ od -c xxx (проверяет, заканчивается ли он теперь на cr lf)
0000000 привет \ r \ n

Ави
источник
0

В Xcode 9 на левой панели откройте / выберите файл в навигаторе проекта . Если файла нет, добавьте его в навигатор проекта .

На правой панели найдите Параметры текста и измените Концы строк на Windows (CRLF) .

XCode screendumpscreendump из XCode

matrix3003
источник