लाइन अंत संरक्षित करें


111

मैं खिड़कियों पर कुछ प्रतिस्थापन करने के लिए sed चलाता हूं और मैंने देखा कि यह स्वचालित रूप से लाइन एंडिंग को यूनिक्स (\ n) में बदल देता है। क्या विंडोज लाइन एंडिंग (\ r \ n) का उपयोग करने के लिए sed को बताने का विकल्प है या फ़ाइल से लाइन एंडिंग को संरक्षित करने के लिए बेहतर है?

नोट: मैं unxutils से sed का उपयोग करता हूं: http://unxutils.sourceforge.net/


2
नीचे दिए गए समाधान macOS पर काम नहीं करते हैं।
विलियम एंट्रीकेन

मुझे यह बहुत दूर लगा और यह अभी भी काम नहीं आयाLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
विलियम एंट्रिक

तो वास्तव में ऊपर की कमांड काम करती है और मैंने अभी git diffकार्यक्रम में बग की खोज की है ।
विलियम एंट्रीकेन

1
आप sed उपयोग कर सकते हैं (किसी विशेष विकल्प के बिना) + unix2dos
एमईएमएस

जवाबों:


143

आप -bफ़ाइल को बाइनरी के रूप में मानने के लिए sed के लिए विकल्प का उपयोग कर सकते हैं । यह विंडोज पर साइबरविन की सेड के साथ समस्या को ठीक करेगा।

उदाहरण: sed -b 's/foo/bar/'

यदि आप पंक्ति के अंत से मेल खाना चाहते हैं, तो वैकल्पिक कैरिज रिटर्न को मैच, कैप्चर और कॉपी करना याद रखें।

उदाहरण: sed -b 's/foo\(\r\?\)$/bar\1/'

से sed आदमी पेज :

-बी - binary

यह विकल्प हर प्लेटफ़ॉर्म पर उपलब्ध है, लेकिन केवल वही प्रभावी है जहाँ ऑपरेटिंग सिस्टम टेक्स्ट फ़ाइलों और बाइनरी फ़ाइलों के बीच अंतर करता है। जब इस तरह का भेद किया जाता है — जैसा कि MS-DOS, Windows, Cygwin के लिए होता है - टेक्स्ट फाइलें एक गाड़ी के रिटर्न और एक लाइन फीड कैरेक्टर द्वारा अलग की गई लाइनों से बनी होती हैं, और sed में अंतिम CR नहीं दिखता है। जब यह विकल्प निर्दिष्ट किया जाता है, तो sed द्विआधारी मोड में इनपुट फाइलें खोलेगा, इस प्रकार इस विशेष प्रसंस्करण का अनुरोध नहीं करेगा और लाइनों को एक लाइन फीड पर समाप्त करने पर विचार करेगा। `


5
ध्यान दें कि यह sed -iसाइबरविन (मेरे लिए) पर काम नहीं करता है , लेकिन आप इसके आसपास काम कर सकते हैं। अद्यतन के लिए धन्यवाद - अन्य उत्तर इस विषय पर कुछ समय के लिए अंतिम शब्द थे।
हार्पो

ध्यान दें, यह विकल्प मैक पर sed के साथ उपलब्ध नहीं है।
सेंथिल कुमारन

21
मेरे साथ भी काम करता है sed -i: इसे टाइप करना महत्वपूर्ण है। जब sed -biऔर sed -i -bकाम sed -ibकरता है , तो काम नहीं करता है: क्यों (इसके bलिए बैकअप प्रतिलिपि के लिए प्रत्यय का उपयोग करता है) के लिए मैन पेज देखें ।
ओलाफ मेंडल

2
उपयोग:sed -bi 's/foo/bar/'
कुणाल बी।

2
विंडोज साइबरगन में मेरे लिए काम नहीं करता है। जिन तर्ज पर सेड ने बदलाव किया है, वे रेखाएं यूनिक्स हैं। बाकी लाइनों में विंडोिश लाइन-एंडिंग्स हैं। इस प्रकार मेरी फाइल को अलग-अलग लाइन एंडिंग के साथ मिश्रित लाइनें मिलीं।
truthadjustr

10

आप अपनी मौजूदा स्क्रिप्ट के अंत में इस तरह से उप के \nलिए कोशिश कर सकते हैं \r\n:

sed 's/foo/bar/;s/$/\r/'

या शायद

 sed -e 's/foo/bar/' -e 's/$/\r/'

यदि उपरोक्त दोनों में से कोई भी काम नहीं है, तो आपको अपने संस्करण के लिए विशिष्ट मैन पेज से परामर्श sedकरना होगा कि क्या ऐसा विकल्प मौजूद है। ध्यान दें कि * nix संस्करण sedऐसा करने के लिए बिना लाइन के टर्मिनेटर को परिवर्तित नहीं करते हैं।

एक अन्य विकल्प का उपयोग करने के लिए है cygwinसंस्करण की sedजो नहीं करना चाहिए इस अवांछनीय व्यवहार किया है।


15
साइबर वर्जन में यह अवांछनीय व्यवहार होता है।
हार्पो

2
यदि फ़ाइल में \ n ( 0x0A) और \ r \ n ( 0x0D 0x0A) दोनों हैं - तो यह प्रस्तावित समाधान (हमेशा \ r को पुनः इंजेक्ट करते हुए) इसे तोड़ता है।
व्लाड

यह मेरे लिए MSYS2 / MinGW का उपयोग करके काम करता है। साभार @SiegeX
एंटुमडेल्यूज

6

वैकल्पिक रूप से, (इस साइबर संस्करण) perl -peको यह समस्या नहीं लगती है।


MacOS पर sed में -b विकल्प नहीं है और मूल प्रश्न में वर्णित के समान मुद्दे हैं। पर्ल विकल्प में यह समस्या नहीं है, इसलिए आपके सुझाव के लिए धन्यवाद। sed -i -e 's/<img[^>]*\/>//g' *.xml'\ n' के द्वारा लाइन एंडिंग की जगह perl -i -p -e 's/<img[^>]*\/>//g' *.xmlमूल लाइन एंडिंग को संरक्षित करता है
गुरुनिवर्स

2

यदि आप केवल -b स्विच निर्दिष्ट करते हैं और पुनर्निर्देशित करते हैं, तो Gnuwin को न्यूलाइन (जीत-> यूनिक्स) को गड़बड़ करने के लिए दबाया जा सकता है। -I (इनलाइन) स्विच का उपयोग करने से गड़बड़ हो जाएगी।

Eg sed.exe -b "s / \ xFF \ xFE //" c: \ temp \ in.csv> c: \ temp \ out.csv


1
मेरे उत्तर-i में कार्य मोड के साथ एक संस्करण देखें ।
वडज़िम

2

मैंने पाया कि sed-4.4.exeसे https://github.com/mbuilov/sed-windows यह के रूप में शुद्ध जीत है

  • डिफ़ॉल्ट मोड में विंडोज़ CRLF लाइन अंत का उपयोग करता है
  • -bमोड में मूल लाइन अंत को संरक्षित करता है
  • इन-प्लेस -iमोड के साथ सही तरीके से काम करता है
  • यह भी प्रदान करता है -zके साथ मोड \0delimeters के बजाय \nजो काम कभी कभी हो सकता है भी

यह भी देखें sed विकल्पों की सूची और सभी खिड़कियों sed बंदरगाहों की सूची

ध्यान दें कि gnuwin32 sed 4.2.1 करता भ्रष्ट लाइन अंत में -biमोड और नहीं है -zसब पर मोड।

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