Перетворення форматування нового рядка з Mac у Windows


133

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


3
Загальний інструмент, який я створив, не знайшовши задовільного рішення з промисловою міцністю github.com/mdolidon/endlines
Mathias Dolidon

Відповіді:


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 в DOS не працює для мене на OS X Lion - це просто вставляє текст «г» в кінці кожного рядка. perlКоманда працює , хоча.
Ergwun

7
OSX використовує старішу версію sed. Я використовую Homebrew для OSX і встановив gnu-sed. Ви використовуєте команду "gsed" замість "sed". Це працює.
Джон

2
Використовуйте Homebrew, щоб отримати пакунки dos2unix та unix2dos.
Пратюш

10
У OS X Yosemite все ще є та сама проблема sed, але ви можете обійти її, не встановлюючи Homebrew, gnu-sed або unix2dos: Use sed -e 's/$/^M/' inputfile > outputfile, де ^Mкеруючий символ, створений у командному рядку через Ctrl+V Ctrl+M.
LarsH

2
Ще одне вирішення для Mac OS (тестоване на 10.13.6 High Sierra): Поставте a $перед єдиною цитатою, що містить команду sed: sed $'s/\r$//'Пояснення: bash розшифровує звороту косу рису в $'...'рядках. Докладні відомості див. У розділі gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html .
jcsahnwaldt Відновити Моніку

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

5
Дивовижна річ у цих сценаріях - це те, що вони регулярними виразами показують ТОЧНО, яким потрібно конверсію в кінці рядка, щоб конвертувати в будь-який формат, починаючи з будь-чого.
пбр

будьте обережні з цим для деяких установок Cygwin / git bash у системах Windows. Це може дати вам Can't do inplace edit on file: Permission denied.і видалити файл. Замість цього загляньте до інших утиліт.
Денніс

Величезне спасибі за показ "Перетворити в Unix". Я був таким чином, і ваша подвійна відповідь допомогла мені, і я отримав свою привітання.
недійсне

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 не існує на моєму комп'ютері, і я не знайшов місця для їх встановлення.
Ярін

@mgadda: +1 - так, зараз я перейшов на домашню мову з MacPorts і не оглядався.
Пол Р

15

Просто trвидаліть:

tr -d "\r" <infile.txt >outfile.txt

1
Спробував perl і sed, не вийшло (я міг зрозуміти це, не варто спробувати). Це спрацювало чудово.
RandomInsano

Це було першим рішенням, коли я знайшов, що номери рядків BBEdit не відповідають кількості рядків, коли я читав їх за допомогою Python (а не збігався wc -l).
Дарил Спітцер

1
це видаляє всі розриви рядків. Насправді мені все-таки потрібно мати перерви рядків, але з \ n
UserYmY

" hints.macworld.com/article.php?story=20031018164326986 " також має хороший опис того, як використовувати trкоманду для виконання різних перетворень. Використовуйте hexdumpабо подібне, щоб дізнатися, який тип конвенції в кінці рядка зараз використовується у файлі.
Майк Робінсон

6
  1. Встановіть dos2unix з домашньою мовою
  2. Запустіть find ./ -type f -exec dos2unix {} \;для рекурсивного перетворення всіх закінчень рядків у поточній папці

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


0

У Yosemite OSX використовуйте цю команду:

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

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


Також зверніть увагу , що sed це розуміють зворотний слеш-вислизає , такі як \rі `` \ n` і , отже , можуть також використовувати їх в підміні. Насправді вам не потрібно вводити буквальний елемент управління M для позначення цього символу (або будь-якого іншого). Принцип використання sed-i) для будь- якого перетворення подібного роду є дуже хорошим, тому що, на відміну від trвас, ви не обмежуєтесь "одним символом одночасно".
Майк Робінсон

0

Розширюючи відповіді Енн та ДжозефH, використовуючи perl у короткому сценарії perl, оскільки я лінивий дуже довго вводити perl-one-liner.
Створіть файл, названий, наприклад, "unix2dos.pl", і покладіть його в каталог на своєму шляху. Відредагуйте файл, щоб він містив 2 рядки:

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

Припустимо, що "perl" повертає "/ usr / bin / perl" у вашу систему. Зробіть файл виконуваним (chmod u + x unix2dos.pl).

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

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


0

У Xcode 9 на лівій панелі відкрийте / виберіть файл у навігаторі проекту . Якщо файлу немає, перезапустіть його в навігатор проекту .

На правій панелі знайдіть Налаштування тексту та змініть закінчення рядків на Windows (CRLF) .

Прокрутка XCodeперегляд екрана від XCode

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