मैक से विंडोज के लिए नई स्वरूपण परिवर्तित


133

मुझे एक रूपांतरण उपयोगिता / स्क्रिप्ट की आवश्यकता है जो मैक पर उत्पन्न एक .sql डंप फ़ाइल को विंडोज पर एक पठनीय में बदल देगी। यह एक समस्या है जो मैंने यहां की थी । यह मुद्दा टेक्स्ट फ़ाइलों में न्यूलाइन फॉर्मेटिंग के साथ लगता है, लेकिन मुझे रूपांतरण करने के लिए कोई टूल नहीं मिल रहा है ...


3
एक सामान्य उपकरण मैं के बाद औद्योगिक ताकत के साथ किसी भी संतोषजनक समाधान नहीं मिल रहा बनाया github.com/mdolidon/endlines
मैथियास Dolidon

जवाबों:


134

Windows का उपयोग करता है carriage return+ line feednewline के लिए:

\r\n

यूनिक्स केवल Line feedन्यूलाइन के लिए उपयोग करता है:

\n

अंत में, बस \nद्वारा होने वाली हर घटना को प्रतिस्थापित करें \r\n
दोनों unix2dosऔर dos2unixडिफ़ॉल्ट पर मैक 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डॉस के लिए यूनिक्स के लिए आदेश पर ओएस एक्स शेर मेरे लिए काम नहीं करता है - यह सिर्फ प्रत्येक पंक्ति के अंत में पाठ "आर" सम्मिलित करता है। perlआदेश हालांकि काम करता है।
एर्ग्वन

7
OSX sed के पुराने संस्करण का उपयोग करता है। मैं OSX के लिए होमब्रे का उपयोग करता हूं, और ग्नू-सेड स्थापित करता हूं। आप "sed" के बजाय "gsed" कमांड का उपयोग करें। यह काम करता है।
जॉन

2
इसके बजाय dos2unix और unix2dos पैकेज पाने के लिए Homebrew का उपयोग करें।
प्रत्यूष

10
OS X Yosemite अभी भी साथ एक ही समस्या है sed, लेकिन आप इसे चारों ओर Homebrew, gnu-sed या unix2dos की स्थापना के बिना काम कर सकते हैं: उपयोग sed -e 's/$/^M/' inputfile > outputfile, जहां ^Mएक नियंत्रण चरित्र के माध्यम से कमांड लाइन पर उत्पादन किया है Ctrl+V Ctrl+M
लार्क्स

2
मैक ओएस के लिए एक और वर्कअराउंड (10.13.6 हाई सिएरा पर परीक्षण किया गया): $सिंगल कमांड से पहले एक सीड कमांड रखें: sed $'s/\r$//'स्पष्टीकरण: $'...'स्ट्रिंग्स में बैकस्लैश- एस्केड्स को बैश करता है । देखें gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html जानकारी के लिए।
jcsahnwaldt

127

यह ऐनी के उत्तर का एक उन्नत संस्करण है - यदि आप पर्ल का उपयोग करते हैं, तो आप एक नई फ़ाइल बनाने के बजाय फ़ाइल 'इन-प्लेस' पर संपादित कर सकते हैं:

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
इन लिपियों के बारे में भयानक बात यह है कि वे नियमित अभिव्यक्तियों के साथ दिखाते हैं, वास्तव में क्या अंत-की-लाइन रूपांतरण को किसी भी चीज़ से शुरू होने वाले प्रारूप में बदलने की आवश्यकता है।
21

Windows सिस्टम पर कुछ Cygwin / git bash स्थापनाओं पर इससे सावधान रहें। यह आपको दे सकता है Can't do inplace edit on file: Permission denied., और फ़ाइल को हटा सकता है। इसके बजाय अन्य उपयोगिताओं में देखें।
डेनिस

"यूनिक्स में कनवर्ट करें" दिखाने के लिए बहुत धन्यवाद। मैं उस तरह से था और आपके दोहरे उत्तर ने मेरी मदद की, और मेरा उत्थान हुआ।
null

112

आप Homebrew के साथ unix2dos स्थापित कर सकते हैं

brew install unix2dos

तो आप यह कर सकते हैं:

unix2dos file-to-convert

आप डॉस फ़ाइलों को यूनिक्स में भी बदल सकते हैं:

dos2unix file-to-convert

9
अब जो भी इसके पार आता है, उसके लिए होमब्रेव फॉर्मूला कहा जाता है dos2unix। आप करना चाहेंगे brew install dos2unix
ज्योफ

13
दरअसल, या तो ठीक है brew install unix2dosया brew install dos2unixठीक काम। वे एक ही पैकेज स्थापित करते हैं। जो भी नाम
बोलें

2
या साथ macports : port install dos2unix
फेंग

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 या अपने मैक का उपयोग करने पर MacPorts


unix2dos / dos2unix मेरे मैक पर मौजूद नहीं है और मुझे उन्हें स्थापित करने के लिए कोई जगह नहीं मिली है- क्या आप किसी के बारे में जानते हैं?
यारिन

@mgadda: +1 - हाँ, मैंने कुछ समय पहले MacPorts से होमब्रेव पर स्विच किया और पीछे मुड़कर नहीं देखा।
पॉल आर।

15

बस trहटाएँ:

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

1
कोशिश की पर्ल और sed, काम नहीं किया (मैं यह समझ सकता था, एक कोशिश के लायक नहीं था)। इसने बहुत अच्छा काम किया।
रैंडमइन्सानो

यह पहला समाधान था जो मुझे BBEdit के लाइन नंबरों से मिला था जो लाइनों की गिनती से मेल नहीं खाते थे क्योंकि मैंने उन्हें पायथन (और मिलान नहीं 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 से डॉस प्रारूप में फ़ाइलों को परिवर्तित कर सकते हैं। उदाहरण के लिए:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF

2

निम्नलिखित एक पूर्ण स्क्रिप्ट है जो उपर्युक्त उत्तरों पर आधारित है और साथ ही साथ मैक ओएस एक्स पर जाँच और काम करता है और अन्य लिनक्स / यूनिक्स प्रणालियों पर भी काम करना चाहिए (हालाँकि यह परीक्षण नहीं किया गया है)।

#!/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

1

यहाँ एक बहुत ही सरल तरीका है, मेरे लिए अच्छा काम किया, सौजन्य डेवी शमीट्स का वेबलॉग :

cat foo | col -b > foo2

जहां foo वह फाइल है जिसमें लाइन के अंत में Control + M अक्षर होते हैं, और आपके द्वारा बनाई जा रही नई फाइल को foo2 करते हैं।


0

Yosemite OSX पर, इस कमांड का उपयोग करें:

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

जहां ^Mअनुक्रम का उपयोग करके हासिल की है Ctrl+ Vतो Enter


यह भी ध्यान रखें कि sed करता है समझ में बैकस्लैश-निकल जाता है जैसे \rऔर `` \ n` और इसलिए भी प्रतिस्थापन में इन का उपयोग कर सकते हैं। आपको वास्तव में उस चरित्र (या किसी अन्य) को संदर्भित करने के लिए शाब्दिक नियंत्रण-एम इनपुट नहीं करना है। इस तरह के किसी भी प्रकार के रूपांतरण का उपयोग करने sed(और -i) का सिद्धांत बहुत अच्छा है, क्योंकि, इसके विपरीत , आप "एक समय में एक चरित्र" तक सीमित नहीं हैं। tr
माइक रॉबिन्सन

0

ऐनी और जोसेफ के जवाबों पर विस्तार करते हुए, एक छोटी सी पर्ल स्क्रिप्ट में पर्ल का उपयोग कर रहा हूं, क्योंकि मैं बहुत ही आलसी-टाइप लाइनर टाइप करने के लिए बहुत आलसी हूं।
एक फ़ाइल बनाएं, जिसका नाम "unix2dos.pl" है और इसे अपने पथ में निर्देशिका में रखें। 2 लाइनों को शामिल करने के लिए फ़ाइल को संपादित करें:

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

यह मानते हुए कि आपके सिस्टम पर "कौन सा पर्ल" लौटाता है "/ usr / bin / perl"। फ़ाइल को निष्पादन योग्य बनाएं (chmod u + x unix2dos.pl)।

उदाहरण:
$ प्रतिध्वनि "हैलो"> xxx
$ od -c xxx (यह जाँचता है कि फ़ाइल एक nl के साथ समाप्त होती है)
0000000 hello \ n

$ unix2dos.pl xxx
$ od -c xxx (यह देख कर कि यह अब cr lf में समाप्त हो गया है)
0000000 hello-r + n


0

बाएं पैनल में Xcode 9 में प्रोजेक्ट नेविगेटर में अपनी फ़ाइल खोलें / चुनें । यदि फ़ाइल नहीं है, तो ड्रग-एंड-ड्रॉप को प्रोजेक्ट नेविगेटर में छोड़ दें ।

दाएं पैनल पर टेक्स्ट सेटिंग्स ढूंढें और लाइन एंडिंग्स को विंडोज (CRLF) में बदलें ।

एक्सकोड स्क्रूम्पXCode से पंगा लेना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.