हर न्यूलाइन से पहले गाड़ी का रिटर्न कैसे जोड़ें?


28

मेरे पास एक फ़ाइल है जो केवल \nनई लाइनों के लिए उपयोग करती है, लेकिन मुझे \r\nप्रत्येक नई लाइन के लिए इसकी आवश्यकता है । मैं यह कैसे कर सकता हूँ?

उदाहरण के लिए, मैंने इसका उपयोग करके विम में हल किया :%s/\n/\r\n/g, लेकिन मैं एक स्क्रिप्ट या कमांड-लाइन एप्लिकेशन का उपयोग करना चाहूंगा। कोई सुझाव?

मैंने इसे देखने की कोशिश की sedया grep, लेकिन मैं भागने के अनुक्रम वर्कआर्ड्स से तुरंत भ्रमित हो गया (मैं इन आदेशों के साथ थोड़ा हरा हूं)।

यदि रुचि है, तो आवेदन यहाँ मेरे प्रश्न / उत्तर से संबंधित है

जवाबों:


36

आप unix2dos (जो डेबियन पर पाया जाता है) का उपयोग कर सकते हैं :

unix2dos file

ध्यान दें कि यह कार्यान्वयन एक सम्मिलित नहीं होंगे CRहर से पहले LFही उन से पहले, LFकि पहले से ही एक (और केवल एक) से पहले नहीं कर रहे हैं 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

ध्यान दें कि unix2dox प्रत्येक LF CRसे पहले नहीं डाला जाएगा , केवल उन LF से पहले जो पहले से ही एक (और केवल एक) CR से पहले नहीं हैं।
स्टीफन चेज़लस

@ स्टीफनचेज़लस: बिंदु के लिए धन्यवाद, इसे मेरे उत्तर में जोड़ा गया।
cuonglm

1
मेरे लिए यहाँ जानकारी का मुख्य भाग चाल के '\r'साथ प्रयोग कर रहा था sed
रोरेश

8

यह वास्तव में क्या unix2dosहै:

$ unix2dos file.txt

यह file.txtCRLF लाइन एंडिंग वाले संस्करण के साथ इन-प्लेस को बदल देगा ।

यदि आप इसके साथ करना चाहते हैं sed, तो आप प्रत्येक पंक्ति के अंत में एक गाड़ी वापसी सम्मिलित कर सकते हैं:

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

प्रतिस्थापित कर देता है ( s) लाइन (के अंत से पहले शून्य आकार क्षेत्र सही $) के साथ \r। इन-प्लेस प्रतिस्थापन (जैसे unix2dosकरता है) करने के लिए, का उपयोग करें sed -i.bak, हालांकि यह एक गैर-मानक एक्सटेंशन है - यदि आपके पास यह नहीं है, तो एक अस्थायी फ़ाइल का उपयोग करें।


3
\rप्रतिस्थापन में उपयोग पोर्टेबल नहीं है। कम से कम, यह मैक OSX में काम नहीं करेगा।
congonglm

ध्यान दें कि unix2dos के कई कार्यान्वयन हैं। (जैसे आप एक विशिष्ट कार्यान्वयन के मुख पृष्ठ के लिए एक लिंक दे सकते हैं waterlan.home.xs4all.nl/dos2unix.html के रूप में डेबियन पर होता है) के बजाय linux.die.net/man जो यह स्पष्ट नहीं है जो कार्यान्वयन (या संस्करण) प्रलेखित है। नोट वहाँ कुछ कर रहे हैं कि u2d, ux2dos, todosचारों ओर के साथ-साथ आदेश देता है।
स्टीफन चेजलस

2

यदि आप एक यूनिक्स मशीन (OS X, Linux) पर रूपांतरण कर रहे हैं, तो फ़ाइल को इसके साथ खोलें viया vim:

$ vim my-file

यह सुनिश्चित करने के लिए ESC कुंजी दबाएँ कि आप इन्सर्ट मोड में नहीं हैं, फिर टाइप करें

:set ff=dos

या

:set fileformat=dos

यह फाइल फॉर्मेट को सेट करके रूपांतरण करता है।

फ़ाइल लिखने और संपादक उपयोग को छोड़ने के लिए

:wq

कमांड लाइन पर आप कर सकते हैं

$ vi +':w ++ff=dos' +':q' my-file

सभी चरणों को समझाने के लिए धन्यवाद - एक नौसिखिया के लिए यह समझना बहुत आसान बनाता है कि क्या चल रहा है।
user3616725

2

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

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

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

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

  • POSIX पूर्व का समर्थन नहीं करता \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

1

एक पोर्टेबल शेल फ़ंक्शन जो यह करेगा:

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

उसके साथ आप कर सकते हैं:

u2dos file >dosfile

1

जाग में आप कोशिश कर सकते हैं

awk '{print $0 "\r"}'

या

awk -v r=$'\r' '{print $0 r}'

$'\r'के हवाले से के रूप में की तरह कुछ गोले द्वारा समर्थित एएनएसआई-सी शैली का एक उदाहरण है ksh93, bash, zsh, mkshऔर FreeBSD sh और संभावना एकल यूनिक्स विशिष्टता को 8 अंक में शामिल किया जाना है

यह अजीब पात्रों को व्यक्त करने का एक सामान्य तरीका प्रदान करता है, उदाहरण के लिए, यह प्रयास करें:

awk -v r=$'\U0001F608' '{print $0 r}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.