कैसे Bash स्क्रिप्ट में Unix newline (LF) में DOS / Windows न्यूलाइन (CRLF) कन्वर्ट करें?


336

मैं प्रोग्रामेटिक रूप से (अर्थात, उपयोग नहीं कर रहा vi) DOS / Windows के नए लिंक को यूनिक्स में कैसे बदल सकता हूं ?

dos2unixऔर unix2dosआदेशों कुछ सिस्टम पर उपलब्ध नहीं हैं। मैं कैसे sed/ awk/ जैसे आदेशों के साथ इनका अनुकरण कर सकता हूं tr?


9
सामान्य तौर पर, बस dos2unixअपने पैकेज मैनेजर का उपयोग करके इंस्टॉल करें, यह वास्तव में बहुत सरल है और अधिकांश प्लेटफार्मों पर मौजूद है।
ब्रैड कोच

1
माना! @ ब्रैडकोच मैक ओएसएक्स पर 'काढ़ा स्थापित dos2unix' के रूप में सरल
स्माइलिट

जवाबों:


322

आप trडॉस से यूनिक्स में बदलने के लिए उपयोग कर सकते हैं ; हालाँकि, आप इसे केवल सुरक्षित रूप से कर सकते हैं यदि CR आपकी फ़ाइल में केवल CRLF बाइट जोड़ी के पहले बाइट के रूप में दिखाई देता है। यह आमतौर पर मामला है। आप तब उपयोग करते हैं:

tr -d '\015' <DOS-file >UNIX-file

ध्यान दें कि नाम नाम DOS-fileसे अलग है UNIX-file; यदि आप एक ही नाम का दो बार उपयोग करने का प्रयास करते हैं, तो आप फ़ाइल में कोई डेटा नहीं रखेंगे।

आप इसे दूसरे तरीके से नहीं कर सकते (मानक 'tr' के साथ)।

यदि आप जानते हैं कि गाड़ी को एक स्क्रिप्ट में कैसे वापस जाना है ( control-V, control-Mकंट्रोल-एम दर्ज करने के लिए), तो:

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

जहां '^ M' कंट्रोल-एम कैरेक्टर है। गाड़ी वापसी को निर्दिष्ट करने के लिए आप bash एएनएसआई-सी कोटिंग तंत्र का भी उपयोग कर सकते हैं:

sed $'s/\r$//'     # DOS to Unix
sed $'s/$/\r/'     # Unix to DOS

हालांकि, अगर आप इस बहुत बार ऐसा करने के लिए करने जा रहे हैं (एक से अधिक बार, मोटे तौर पर बोल रहा है), यह कहीं अधिक समझदार रूपांतरण प्रोग्राम इंस्टॉल करने का है (उदाहरण के लिए dos2unixऔर unix2dos, या शायद dtouऔर utod) और उन्हें का उपयोग करें।

यदि आपको संपूर्ण निर्देशिकाओं और उपनिर्देशिकाओं को संसाधित करने की आवश्यकता है, तो आप उपयोग कर सकते हैं zip:

zip -r -ll zipfile.zip somedir/
unzip zipfile.zip

यह CRLF से CR में परिवर्तित लाइन एंडिंग के साथ एक ज़िप आर्काइव बनाएगा। unzipफिर परिवर्तित फ़ाइलों को वापस रख देगा (और आपसे फ़ाइल पूछेगा - आप जवाब दे सकते हैं: हाँ-से-सभी)। इसे इंगित करने के लिए @vmsnomad को श्रेय।


9
tr -d '\015' <DOS-file >UNIX-fileजहाँ DOS-file== का उपयोग करके UNIX-fileकेवल एक खाली फ़ाइल में परिणाम होता है। दुर्भाग्य से आउटपुट फ़ाइल को एक अलग फ़ाइल होना चाहिए।
ब्यूटिक बटुक

3
@ बटलबूटकस: ठीक है, हाँ; इसलिए मैंने दो अलग-अलग नामों का इस्तेमाल किया। यदि आप प्रोग्राम से पहले इनपुट फ़ाइल को पूरी तरह से पढ़ लेते हैं, जैसा कि आप तब करते हैं जब आप एक ही नाम का उपयोग दो बार करते हैं, तो आप एक खाली फ़ाइल के साथ समाप्त होते हैं। यह यूनिक्स जैसी प्रणालियों पर समान व्यवहार है। यह एक इनपुट फ़ाइल को सुरक्षित रूप से अधिलेखित करने के लिए विशेष कोड की आवश्यकता है। निर्देशों का पालन करें और आप ठीक हो जाएंगे।
जोनाथन लेफ़लर

मुझे लगता है कि इन-फाइल सर्च-रिप्लेसमेंट फंक्शनलिटी हियरहेयर याद है।
बुटिक बटुकस

4
जगह हैं; आपको यह जानना होगा कि उन्हें कहां खोजना है। सीमा के भीतर, GNU sedविकल्प -i(इन-प्लेस के लिए) काम करता है; सीमाएं जुड़ी हुई फाइलें और सीमलाइंक हैं। sortआदेश है 'हमेशा' (1979 से पहले नहीं तो) समर्थित -oविकल्प जो इनपुट फ़ाइलों में से एक सूचीबद्ध कर सकते हैं। हालाँकि, यह भाग में है क्योंकि sortइसके किसी भी आउटपुट को लिखने से पहले इसके सभी इनपुट को अवश्य पढ़ना चाहिए। अन्य कार्यक्रम छिटपुट रूप से उनकी एक इनपुट फाइल को अधिलेखित करने का समर्थन करते हैं। कर्निघन और पाइक द्वारा 'द यूनिक्स प्रोग्रामिंग पर्यावरण' में समस्याओं से बचने के लिए आप एक सामान्य उद्देश्य कार्यक्रम (स्क्रिप्ट) पा सकते हैं ।
जोनाथन लेफ़लर

3
तीसरे विकल्प ने मेरे लिए काम किया, धन्यवाद। मैंने -i विकल्प का उपयोग किया: sed -i $'s/\r$//' filename- जगह में संपादित करने के लिए। मैं एक ऐसी मशीन पर काम कर रहा हूं जिसमें इंटरनेट तक पहुंच नहीं है, इसलिए सॉफ्टवेयर इंस्टॉलेशन एक समस्या है।
वारेन ड्यू

64
tr -d "\r" < file

उपयोग करने वाले उदाहरणों के लिए यहां एक नज़र डालें sed:

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//'               # assumes that all lines end with CR/LF
sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/"            # command line under ksh
sed 's/$'"/`echo \\\r`/"             # command line under bash
sed "s/$/`echo \\\r`/"               # command line under zsh
sed 's/$/\r/'                        # gsed 3.02.80 or higher

sed -iइन-प्लेस रूपांतरण के लिए उपयोग करें sed -i 's/..../' file


10
मैंने अपनी फ़ाइल के बाद से एक वेरिएंट का उपयोग किया \r:tr "\r" "\n" < infile > outfile
मैट टॉड

1
@MattTodd क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं? को -dअधिक बार चित्रित किया जाता है और "केवल \r" स्थिति में मदद नहीं करेगा ।
n611x007

5
ध्यान दें कि प्रस्तावित \rकरने के लिए \nमानचित्रण डबल रिक्ति फ़ाइलों का प्रभाव पड़ता है; डॉस में समाप्त होने वाली प्रत्येक सिंगल सीआरएलएफ लाइन \n\nयूनिक्स में बन जाती है।
जोनाथन लेफ़लर

क्या मैं इसे पुनरावर्ती रूप से कर सकता हूं?
एरोन फ्रेंके

36

POSIX के साथ ऐसा करना मुश्किल है:

  • POSIX Sed समर्थन नहीं करता है \rया \15। यहां तक ​​कि अगर यह किया, जगह विकल्प -iमें POSIX नहीं है

  • POSIX Awk समर्थन करता है \rऔर \15, हालांकि -i inplaceविकल्प POSIX नहीं है

  • d2u और dos2unix POSIX उपयोगिताओं नहीं हैं , लेकिन पूर्व है

  • POSIX पूर्व का समर्थन नहीं करता \r, \15, \nया\12

कैरिज रिटर्न निकालने के लिए:

ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file

गाड़ी का रिटर्न जोड़ने के लिए:

ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file

2
ऐसा लगता है कि POSIX trसपोर्ट करता है \r तो आप भी उपयोग कर सकते हैं printf '%s\n' '%!tr -d "\r"' x | ex file(हालांकि दी गई, इसे हटा दिया गया, \rभले ही तुरंत पूर्व न हो \n)। इसके अलावा, -bविकल्प exPOSIX द्वारा निर्दिष्ट नहीं है।
वाइल्डकार्ड

1
POSIX में ऐसा करना आसान है। स्क्रिप्ट में CR शाब्दिक लिखकर इसे टाइप करें (यह नियंत्रण-एम है)।
जोशुआ

28

आप v-प्रोग्राम का उपयोग विकल्प -c {कमांड} के साथ कर सकते हैं:

डॉस टू यूनिक्स:

vim file.txt -c "set ff=unix" -c ":wq"

यूनिक्स से डॉस:

vim file.txt -c "set ff=dos" -c ":wq"

"सेट एफएफ = यूनिक्स / डॉस" का अर्थ फाइल के फाइलफॉर्मैट (एफएफ) को यूनिक्स / डॉस ऑफ एंड फॉर्मेट के अंत में बदलना है।

", wq" का अर्थ है डिस्क पर फ़ाइल लिखना और संपादक को छोड़ना (लूप में कमांड का उपयोग करने की अनुमति देना)


3
यह सबसे सुरुचिपूर्ण समाधान की तरह लग रहा था लेकिन wq का मतलब क्या है, इस बारे में स्पष्टीकरण की कमी दुर्भाग्यपूर्ण है।
जॉरिक स्लीजस्टर

5
जो भी उपयोग viकरेगा उसे पता होगा कि :wqइसका क्या मतलब है। उन लोगों के लिए जो 3 वर्णों का अर्थ नहीं है 1) खुले vi कमांड क्षेत्र, 2) लिखना और 3) छोड़ना।
डेविड न्यूकॉम्ब

मुझे कोई अंदाजा नहीं था कि आप सीएलआई
रॉबर्ट डंडन

आप ": x" के बजाय ": wq" का उपयोग कर सकते हैं
जोसेफॉन्रॉड

25

AWK का उपयोग करके आप कर सकते हैं:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt

पर्ल का उपयोग आप कर सकते हैं:

perl -pe 's/\r$//' < dos.txt > unix.txt

2
एक अच्छा, पोर्टेबल awk समाधान।
mklement0

23

जगह उपयोग में एक फ़ाइल परिवर्तित करने के लिए

dos2unix <filename>

परिवर्तित पाठ को किसी भिन्न फ़ाइल उपयोग के लिए आउटपुट करने के लिए

dos2unix -n <input-file> <output-file>

आप इसे उबंटू या डेबियन के साथ स्थापित कर सकते हैं

sudo apt install dos2unix

या homebrew का उपयोग कर macOS पर

brew install dos2unix

1
मुझे पता है कि सवाल dos2unix के विकल्प के लिए पूछता है लेकिन यह पहला Google परिणाम है।
बोरिस

18

इस समस्या को मानक उपकरणों के साथ हल किया जा सकता है, लेकिन मैं जिस flipकमांड को स्थापित करने की सलाह देता हूं, उसके लिए पर्याप्त रूप से कई जाल हैं , जो कि 20 साल पहले राहुल ढेसी के लेखक द्वारा लिखा गया था zoo। यह एक उत्कृष्ट कार्य करता है, जबकि फ़ाइल स्वरूपों को परिवर्तित करना, उदाहरण के लिए, द्विआधारी फ़ाइलों के अनजाने विनाश से बचना, जो कि बहुत आसान है यदि आप हर CRLF को बदलने के आसपास दौड़ लगाते हैं ...


मूल फ़ाइल को संशोधित किए बिना, स्ट्रीमिंग शैली में ऐसा करने का कोई तरीका?
22

@augurar आप "समान पैकेज" पैकेज
।ebian.org

मुझे एक गलत झंडे के साथ टेक्सक्सो चलाने से मेरे आधे ओएस को तोड़ने का अनुभव था। विशेष रूप से सावधान रहें यदि आप इसे संपूर्ण फ़ोल्डरों पर करना चाहते हैं।
a_P

14

अभी तक पोस्ट किए गए समाधान केवल समस्या के भाग से निपटते हैं, डॉस / विंडोज 'सीआरएलएफ को यूनिक्स के एलएफ में परिवर्तित करते हैं; वह हिस्सा जो गायब है वह यह है कि डॉस सीआरएलएफ को एक लाइन विभाजक के रूप में उपयोग करता है, जबकि यूनिक्स लाइन टर्मिनेटर के रूप में एलएफ का उपयोग करता है । अंतर यह है कि डॉस फ़ाइल (आमतौर पर) फ़ाइल में अंतिम पंक्ति के बाद कुछ भी नहीं होगा, जबकि यूनिक्स होगा। रूपांतरण को ठीक से करने के लिए, आपको उस अंतिम LF को जोड़ना होगा (जब तक कि फ़ाइल शून्य-लंबाई न हो, अर्थात इसमें कोई रेखा न हो)। इसके लिए मेरा पसंदीदा झुकाव (मैक-सीआर-अलग-अलग फ़ाइलों को संभालने के लिए थोड़ा जोड़ा तर्क के साथ, और मोलेस्ट फाइलें नहीं हैं जो पहले से ही यूनिक्स प्रारूप में हैं) थोड़ा सा है:

perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt

ध्यान दें कि यह फ़ाइल का Unixified संस्करण stdout को भेजता है। यदि आप फ़ाइल को एक यूनिफ़ाइड संस्करण के साथ बदलना चाहते हैं, तो पर्ल का -iध्वज जोड़ें ।


@LudovicZenohateLagouardette क्या यह एक सादा पाठ फ़ाइल थी (यानी सीएसवी या टैब-डिमेटेड पाठ), या कुछ और? यदि यह कुछ डेटाबेस-ईश प्रारूप में था, तो इसमें हेरफेर करना जैसे कि यह पाठ था इसकी आंतरिक संरचना को भ्रष्ट करने की बहुत संभावना है।
गॉर्डन डेविसन

एक सादा पाठ csv, लेकिन मुझे लगता है कि यह कल्पना अजीब थी। मुझे लगता है कि इसकी वजह से गड़बड़ हुई। हालांकि चिंता मत करो। मैं हमेशा बैकअप इकट्ठा कर रहा हूं यह असली डेटासेट भी नहीं था, सिर्फ 1 जीबी वाला। असली 26gb है।
लुडोविक ज़ेनोएथ लैगौर्डेट

14

यदि आपके पास dos2unix तक पहुँच नहीं है , लेकिन इस पृष्ठ को पढ़ सकते हैं, तो आप यहाँ से dos2unix.py को कॉपी / पेस्ट कर सकते हैं।

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

सुपरसुसर से क्रॉस-पोस्टेड ।


1
उपयोग भ्रामक है। वास्तविक डिफ़ॉल्ट रूप से सभी इनपुट फ़ाइलों को dos2unixपरिवर्तित करता है । आपका उपयोग पैरामीटर का तात्पर्य है। और असली एक फिल्टर है जो स्टड से पढ़ता है, अगर फाइल नहीं दी जाती है तो स्टडआउट को लिखता है। -ndos2unix
बजे

8

PCRE के साथ सुपर डुपर आसान;

एक स्क्रिप्ट के रूप में, या $@अपनी फ़ाइलों के साथ बदलें ।

#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@

यह आपकी फ़ाइलों को जगह में लिख देगा!

मैं केवल एक बैकअप के साथ ऐसा करने की सलाह देता हूं (संस्करण नियंत्रण या अन्यथा)


धन्यवाद! यह काम करता है, हालांकि मैं फ़ाइल नाम लिख रहा हूं और नहीं --। मैंने इस समाधान को चुना क्योंकि यह मेरे लिए समझना और अनुकूलित करना आसान है। FYI करें, यह स्विच क्या करता है: -pएक "इनपुट करते समय" मान लें, -iजगह में इनपुट फ़ाइल को संपादित करें, -eकमांड का पालन करें
रॉल्फ

कड़ाई से कहे तो, PCRE पर्ल के रेगेक्स इंजन का पुन: कार्यान्वयन है, न कि पर्ल से रेगेक्स इंजन। उन दोनों में यह क्षमता है, हालांकि नाम में संकेत के बावजूद, मतभेद भी हैं।
त्रिकाल

6

एक भी सरल awk समाधान w / oa कार्यक्रम:

awk -v ORS='\r\n' '1' unix.txt > dos.txt

तकनीकी रूप से '1' आपका प्रोग्राम है, b / c awk को दिए गए विकल्प में से एक की आवश्यकता होती है।

अद्यतन : लंबे समय के बाद पहली बार इस पृष्ठ को फिर से देखने के बाद मैंने महसूस किया कि किसी ने अभी तक एक आंतरिक समाधान पोस्ट नहीं किया है, इसलिए यहां एक है:

while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt

यह आसान है, लेकिन केवल स्पष्ट होने के लिए: यह यूनिक्स -> विंडोज / डॉस का अनुवाद करता है, जो ओपी के लिए पूछी गई विपरीत दिशा है।
mklement0

5
यह उद्देश्य पर किया गया था, लेखक के लिए एक अभ्यास के रूप में छोड़ दिया गया था। आईरोल awk -v RS='\r\n' '1' dos.txt > unix.txt
nawK

महान (और आप के लिए शैक्षणिक चालाकी के लिए यश)।
mklement0

1
"b / c awk को दिए गए विकल्प में से एक की आवश्यकता होती है।" - awk को हमेशा एक प्रोग्राम की आवश्यकता होती है, चाहे विकल्प निर्दिष्ट हों या नहीं।
mklement0

1
शुद्ध बैश समाधान दिलचस्प है, लेकिन एक समकक्ष awkया sedसमाधान की तुलना में बहुत धीमा है । इसके अलावा, आपको while IFS= read -r lineविश्वासपूर्वक इनपुट लाइनों को संरक्षित करने के लिए उपयोग करना चाहिए , अन्यथा प्रमुख और अनुगामी व्हाट्सएप को ट्रिम किया जाता है (वैकल्पिक रूप से, readकमांड में कोई चर नाम का उपयोग न करें और साथ काम करें $REPLY)।
mklement0

5

बस उसी प्रश्न पर विचार करना था (विंडोज की तरफ, लेकिन समान रूप से लिनक्स पर लागू होता है।) किसी ने भी CRLF करने का बहुत ही स्वचालित तरीके का उल्लेख नहीं किया है -> अच्छे पुराने zip -llविकल्प (Info-ZIP) का उपयोग करके पाठ-फ़ाइलों के लिए LF रूपांतरण :

zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip 

नोट: यह एक ज़िप फ़ाइल बनाएगा जो मूल फ़ाइल नामों को संरक्षित करेगा लेकिन लाइन अंत को LF में परिवर्तित करेगा। फिर unzipफ़ाइलों को zip'ed के रूप में निकालेगा, जो कि उनके मूल नामों (लेकिन LF-endings के साथ) के साथ है, इस प्रकार स्थानीय मूल फ़ाइलों को अधिलेखित करने के लिए यदि कोई हो।

प्रासंगिक अंश zip --help:

zip --help
...
-l   convert LF to CR LF (-ll CR LF to LF)

मेरे अनुसार, सर्वश्रेष्ठ उत्तर, क्योंकि यह संपूर्ण निर्देशिकाओं और उप-निर्देशिकाओं को संसाधित कर सकता है। मुझे खुशी है कि मैंने उस दूर तक खुदाई की।
कार्म

5

खिड़कियों पर मेरे गिट-बैश में दिलचस्प sed ""चाल पहले से ही किया था:

$ echo -e "abc\r" >tst.txt
$ file tst.txt
tst.txt: ASCII text, with CRLF line terminators
$ sed -i "" tst.txt
$ file tst.txt
tst.txt: ASCII text

मेरा अनुमान है कि इनपुट से लाइनें पढ़ते समय sed उनकी उपेक्षा करता है और हमेशा आउटपुट पर यूनिक्स लाइन अंत लिखता है।


4

इसने मेरे लिए काम किया

tr "\r" "\n" < sampledata.csv > sampledata2.csv 

9
यह हर एक डॉस-न्यूलाइन को दो यूनिक्स-न्यूलाइन में बदल देगा।
मेबलियस

2

यदि आपने होमब्रे को स्थापित किया है तो मैक ओएसएक्स के लिए [ http://brew.sh/desing1]

brew install dos2unix

for csv in *.csv; do dos2unix -c mac ${csv}; done;

सुनिश्चित करें कि आपने फ़ाइलों की प्रतियां बना ली हैं, क्योंकि यह कमांड फाइलों को जगह में बदल देगी। -C मैक विकल्प स्विच को ऑक्स के साथ संगत बनाता है।


यह उत्तर वास्तव में मूल पोस्टर प्रश्न नहीं करता है।
hlin117

2
ओएस एक्स उपयोगकर्ताओं का उपयोग नहीं करना चाहिए -c mac, जो पूर्व-ओएस एक्स-ऑनलाइन CRनईलाइन्स को परिवर्तित करने के लिए है। आप केवल मैक ओएस 9 या उससे पहले की फ़ाइलों के लिए उस मोड का उपयोग करना चाहते हैं।
Askewchan

2

TIMTOWTDI!

perl -pe 's/\r\n/\n/; s/([^\n])\z/$1\n/ if eof' PCfile.txt

@GordonDavisson पर आधारित है

एक की संभावना पर विचार करना चाहिए [noeol]...


2

आप awk का उपयोग कर सकते हैं। रिकॉर्ड विभाजक ( RS) को एक regexp पर सेट करें जो सभी संभावित नईलाइन वर्ण, या वर्णों से मेल खाता है। और ORSयूनिक्स शैली की न्यूलाइन कैरेक्टर में आउटपुट रिकॉर्ड सेपरेटर ( ) सेट करें ।

awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt

वह जो मेरे लिए काम करता है (MacOS, git diffदिखाता है ^ M, vim में संपादित)
Dorian

2

लिनक्स पर M M (ctrl-M) को * nix newlines (^ J) सेड के साथ परिवर्तित करना आसान है।

यह सीएलआई पर कुछ इस तरह होगा, वास्तव में पाठ में एक लाइन ब्रेक होगा। हालाँकि, \ N कि ^ J के साथ sed में गुजरता है:

sed 's/^M/\
/g' < ffmpeg.log > new.log

आप इसे टाइप करते हुए ^ V (ctrl-V), ^ M (ctrl-M) और \ (बैकस्लैश) का उपयोग करके प्राप्त करते हैं:

sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log

2
sed --expression='s/\r\n/\n/g'

चूँकि प्रश्न में sed का उल्लेख है, यह इसे प्राप्त करने के लिए sed का उपयोग करने का सबसे सीधा तरीका है। अभिव्यक्ति जो कहती है वह सभी कैरिज-रिटर्न और लाइन-फीड को केवल लाइन-फीड से बदल देती है। जब आप विंडोज से यूनिक्स में जाते हैं, तो आपको इसकी आवश्यकता होती है। मैंने सत्यापित किया कि यह काम करता है।


हे जॉन पॉल - यह उत्तर हटाए जाने के लिए चिह्नित किया गया था इसलिए मेरे लिए एक समीक्षा कतार में आया। सामान्य तौर पर, जब आपको इस तरह का कोई प्रश्न मिलता है, जो 8 साल का होता है, तो 22 उत्तरों के साथ, आप यह बताना चाहते हैं कि आपका उत्तर इस तरह से उपयोगी है कि अन्य मौजूदा उत्तर नहीं हैं।
zzxyz

0

जोनाथन लेफ़लर के यूनिक्स के डॉस समाधान के विस्तार के रूप में, जब आप फ़ाइल की वर्तमान लाइन के अंत के बारे में अनिश्चित हैं, तो सुरक्षित रूप से डॉस में परिवर्तित करने के लिए:

sed '/^M$/! s/$/^M/'

यह जाँचता है कि CRLF में कनवर्ट करने से पहले CRLF में लाइन समाप्त नहीं होती है।


0

मैंने स्वीकृत उत्तर के आधार पर एक स्क्रिप्ट बनाई ताकि आप अंत में एक अतिरिक्त फ़ाइल की आवश्यकता के बिना इसे सीधे रूपांतरित कर सकें और बाद में इसे हटा और नाम बदल सकें।

convert-crlf-to-lf() {
    file="$1"
    tr -d '\015' <"$file" >"$file"2
    rm -rf "$file"
    mv "$file"2 "$file"
}

बस सुनिश्चित करें कि यदि आपके पास "file1.txt" जैसी कोई फ़ाइल है जो "file1.txt2" पहले से मौजूद नहीं है या इसे अधिलेखित कर दिया जाएगा, तो मैं इसे फ़ाइल को संग्रहीत करने के लिए एक अस्थायी स्थान के रूप में उपयोग करता हूं।


0

4.2 बैश और नए के साथ आप ट्रेलिंग सीआर को स्ट्रिप करने के लिए कुछ इस तरह का उपयोग कर सकते हैं, जो केवल बैश इन का उपयोग करता है:

if [[ "${str: -1}" == $'\r' ]]; then
    str="${str:: -1}"
fi

-3

मैंने OSX पर 's / ^ M $ //' फ़ाइल की कोशिश की। साथ ही कई अन्य तरीके ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- डॉस-लाइन-एंडिंग्स या http://hintsforums.macworld.com/archive/index.php/t-125.html )। किसी ने काम नहीं किया, फ़ाइल अपरिवर्तित रही (btw Ctrl-v Enter को ^ M को पुन: पेश करने की आवश्यकता थी)। अंत में मैंने TextWrangler का उपयोग किया। इसकी कड़ाई से कमांड लाइन नहीं है, लेकिन यह काम करता है और यह शिकायत नहीं करता है।

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