यूनिक्स में कैरिज वापसी निकालें


218

\rयूनिक्स में एक फ़ाइल से सभी गाड़ी के रिटर्न को निकालने का सबसे सरल तरीका क्या है ?


3
क्या आप '\ r' '\ n' के बारे में बात कर रहे हैं, या सिर्फ गंदा \ r's?
v3

जवाबों:


261

मैं तुम्हें मतलब कैरिएज रिटर्न (ग्रहण करने के लिए जा रहा हूँ CR, "\r", 0x0dपर) समाप्त हो जाती है बल्कि सिर्फ एक फ़ाइल के भीतर आँख बंद करके की तुलना में लाइनों की (आप उन सभी को मैं जानता हूँ कि के लिए तार के बीच में हो सकता है)। CRकेवल पहली पंक्ति के अंत में इस परीक्षण फ़ाइल का उपयोग करना :

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix अगर यह आपके सिस्टम पर स्थापित है तो जाने का तरीका है:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

यदि किसी कारण dos2unixसे आप के लिए उपलब्ध नहीं है, तो sedयह करेंगे:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

यदि किसी कारण sedसे आप के लिए उपलब्ध नहीं है, तो edयह एक जटिल तरीके से करेंगे:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

यदि आपके पास कोई भी उपकरण आपके बॉक्स पर स्थापित नहीं है , तो आपको फ़ाइलों को बदलने की कोशिश करने से बड़ी समस्याएं हैं :-)


13
\rकेवल GNU sed के साथ काम करता है, अन्यथा आप यह कर सकते हैं:sed `echo "s/\r//"`
lapo

15
न तो sedहै और न ही echoपहचान \rMacOS पर। इस मामले में केवल printf "\r"काम करने के लिए प्रकट होता है।
स्टीव पॉवेल

30
@ स्टीव की टिप्पणी के बारे में विस्तार से sed "s/$(printf '\r')\$//"
बताने के लिए

7
मैक पर समस्या को ठीक करने के लिए आप एकल-उद्धरण सेड स्ट्रिंग को इस $तरह से उपसर्ग कर सकते हैं : sed $'s@\r@@g' |od -c (लेकिन अगर आप इसे बदलने की \nआवश्यकता होगी तो इसे
बचाना

1
मैं% नहीं 100 यकीन है, लेकिन ओएस एक्स के लिए, का उपयोग कर CTRL-V + CTRL-Mके स्थान पर \rदिखता है जैसे कि यह काम हो सकता है।

240
tr -d '\r' < infile > outfile

देखें ट्र (1)


4
महान नहीं: 1. कार्यस्थल पर काम नहीं करता है, 2. ईओएल को प्रतिस्थापित नहीं कर सकता है (जो आप चाहते हैं या नहीं हो सकता है ...)।
टॉमस गैंडर

10
1. अधिकांश यूनिक्स उपकरण उस तरह से काम करते हैं, और यह आमतौर पर चीजों के बारे में जाने के लिए सबसे सुरक्षित तरीका है क्योंकि यदि आप स्क्रू करते हैं तो आपके पास अभी भी मूल है। 2. जैसा कि कहा गया है कि गाड़ी का रिटर्न निकालना है, न कि लाइन एंडिंग को बदलना। लेकिन ऐसे कई अन्य उत्तर हैं जो आपको बेहतर सेवा दे सकते हैं।
हेनरिक गुस्ताफसन

1
यदि आपका भागने का trसमर्थन नहीं करता है \r, तो '\015'शायद या एक शाब्दिक '^M'(कई टर्मिनलों पर कई गोले में, ctrl-V ctrl-M एक शाब्दिक ctrl-M चरित्र का उत्पादन करेगा)।
त्रिकाल

तो कैसे एक यह परिवर्तन जब आप चाहते हैं करता है outfile = infile?
क्रिस्टोफर

3
@donlan, देर से प्रतिक्रिया लेकिन आप आमतौर पर कुछ का उपयोग करें someProg <in >out && mv out in:।
paxdiablo


32

लिनक्स पर सबसे सरल तरीका है, मेरी विनम्र राय में,

sed -i 's/\r$//g' <filename>

मजबूत उद्धरण प्रतिस्थापन ऑपरेटर के आसपास 's/\r//'हैं आवश्यक । उनके बिना शेल \rएक एस्केप + आर के रूप में व्याख्या करेगा और इसे एक सादे तक कम करेगा r, और सभी निचले मामले को हटा देगा r। यही कारण है कि रोब द्वारा 2009 में ऊपर दिया गया जवाब काम नहीं करता है।

और /gसंशोधक को जोड़ने से यह सुनिश्चित होता है कि कई \rको भी हटा दिया जाएगा, और केवल पहला ही नहीं।


27

एक उपयोगिता है जिसे dos2unix कहा जाता है जो कई प्रणालियों पर मौजूद है, और इसे आसानी से अधिकांश पर स्थापित किया जा सकता है।


6
कभी-कभी इसे डेडोस (और टॉडोस) भी कहा जाता है।
अनाम

लिंक अब नीचे है, कृपया http://dos2unix.sourceforge.net/ पर जाएं
RyanQuey

7

sed -i s/\r// <filename>या सोमसुख; देखें man sedया वेब पर उपलब्ध जानकारी के उपयोग के संबंध में धन sed

इंगित करने के लिए एक चीज उपरोक्त में "गाड़ी वापसी" का सटीक अर्थ है; यदि आप वास्तव में एकल नियंत्रण चरित्र "कैरिज रिटर्न" का मतलब रखते हैं, तो उपरोक्त पैटर्न सही है। यदि आपका मतलब है, अधिक आम तौर पर, सीआरएलएफ (गाड़ी वापसी और एक लाइन फीड, जो कि विंडोज के तहत लाइन फीड कैसे लागू की जाती है), तो आप शायद \r\nइसके बजाय बदलना चाहते हैं । लिनक्स / यूनिक्स में नंगे लाइन फीड (न्यूलाइन) हैं \n


मैं उपयोग करने का प्रयास कर रहा हूं -> sed 's / \ r \ n / = /' countryNew.txt> Demo.txt जो काम नहीं करता है। "टाइगर" "शेर।"
सुवासिस

क्या हम इसका मतलब निकाल सकते हैं कि आप मैक पर हैं? मैंने देखा है कि डार्विन
सेड को

4
FYI करें, s/\r//OS X पर गाड़ी के रिटर्न को हटाने के लिए प्रतीत नहीं होता है, ऐसा लगता है कि rइसके बजाय शाब्दिक वर्ण को हटा दिया गया है। मुझे यकीन नहीं है कि ऐसा क्यों है। हो सकता है कि स्ट्रिंग को उद्धृत करने के तरीके से इसका कुछ लेना-देना हो? वर्कअराउंड के रूप में, काम करने के लिए लगता है की CTRL-V + CTRL-Mजगह का उपयोग कर \r

6

यदि आप एक वीआई उपयोगकर्ता हैं, तो आप फ़ाइल को खोल सकते हैं और गाड़ी का रिटर्न निकाल सकते हैं:

:%s/\r//g

या साथ

:1,$ s/^M//

ध्यान दें कि आपको ctrl-v और फिर ctrl-m दबाकर ^ M टाइप करना चाहिए।


2
महान नहीं: यदि फ़ाइल में हर पंक्ति पर CR है (यानी एक सही DOS फ़ाइल है), तो vim इसे filetype = dos के साथ लोड करेगा, और शो ^M-s बिल्कुल नहीं। इसके आस-पास होने से एक टन कीस्ट्रोक्स होता है, जो कि विम के लिए नहीं बना है;)। मैं सिर्फ sed -iईओएल में सीआर को हटाने को सीमित करने के लिए , और फिर `-ई / \ r $ // g 'पर जाऊंगा।
टॉमस गैंडर

6

एक बार और समाधान ... क्योंकि हमेशा एक और होता है:

perl -i -pe 's/\r//' filename

यह अच्छा है क्योंकि यह जगह पर है और मेरे द्वारा काम किए गए यूनिक्स / लिनक्स के हर स्वाद में काम करता है।


3

कोई और सलाह देता है dos2unixऔर मैं दृढ़ता से इसकी सिफारिश भी करता हूं। मैं अभी और जानकारी प्रदान कर रहा हूं।

यदि स्थापित है, तो अगले चरण पर जाएं। यदि पहले से स्थापित नहीं है, तो मैं इसे इसके माध्यम से स्थापित करने की सलाह दूंगा yum:

yum install dos2unix

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

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

2

यदि आप एक OS (जैसे OS X) का उपयोग कर रहे हैं, जिसमें dos2unixकमांड नहीं है, लेकिन पाइथन इंटरप्रेटर (संस्करण 2.5+) है, तो यह कमांड कमांड के बराबर है dos2unix:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

यह कमांड लाइन पर नामांकित फ़ाइलों के साथ-साथ पाइप और रीडायरेक्ट की तरह दोनों को संभालता है dos2unix। यदि आप इस पंक्ति को अपनी ~ / .bashrc फ़ाइल (या अन्य गोले के लिए समतुल्य प्रोफ़ाइल फ़ाइल) में जोड़ते हैं:

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... अगली बार जब आप लॉग इन (या source ~/.bashrcचालू सत्र में चलाते हैं ) तो आप dos2unixकमांड लाइन पर नाम का उपयोग उसी तरह से कर पाएंगे जैसे कि अन्य उदाहरणों में किया जाता है।


2

यहाँ बात है,

%0dगाड़ी वापसी चरित्र है। इसे यूनिक्स के साथ कंपैटिबल बनाने के लिए। हमें नीचे दिए गए कमांड का उपयोग करने की आवश्यकता है।

dos2unix fileName.extension fileName.extension


1

डॉस फ़ाइल को यूनिक्स फ़ाइल में बदलने के लिए इसे आज़माएँ:

fromdos फ़ाइल


1

UNIX के लिए ... मैंने देखा है dos2unix हटाए गए यूनिकोड हेडर मेरी UTF-8 फ़ाइल बनाते हैं। गिट बैश (विंडोज़) के तहत, निम्न स्क्रिप्ट अच्छी तरह से काम करती है। यह sed का उपयोग करता है। ध्यान दें कि यह केवल लाइनों के सिरों पर गाड़ी-रिटर्न को हटाता है, और यूनिकोड हेडर को संरक्षित करता है।

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

1

यदि आप एक एक्स वातावरण चला रहे हैं और एक उचित संपादक (विजुअल स्टूडियो कोड) है, तो मैं प्रतिगमन का पालन करूंगा:

विजुअल स्टूडियो कोड: लाइन एंडिंग कैसे दिखाएं

बस अपनी स्क्रीन के निचले दाएं कोने पर जाएं, दृश्य स्टूडियो कोड आपको फ़ाइल एन्कोडिंग और फ़ाइल के बाद लाइन कन्वेंशन के अंत दोनों दिखाएगा, बस एक साधारण क्लिक के साथ आप इसे चारों ओर स्विच कर सकते हैं।

बस लिनक्स वातावरण पर नोटपैड ++ के प्रतिस्थापन के रूप में दृश्य कोड का उपयोग करें और आप जाने के लिए तैयार हैं।


या अपने लिनक्स सिस्टम में फाइल को कॉपी करने से पहले अपने विंडोज सिस्टम पर Notepad++कमांड का उपयोग करें Edit / EOL Conversion / Unix (LF)
जेसी चिशोल्म

1

\rकिसी भी UNIX® सिस्टम पर हटाना :

इस प्रश्न के अधिकांश मौजूदा समाधान GNU- विशिष्ट हैं, और OS X या BSD पर काम नहीं करेंगे; नीचे दिए गए समाधान कई और UNIX सिस्टम पर और किसी भी शेल में, से tcshलेकर shअभी तक GNU / Linux पर भी काम करना चाहिए।

OS X, OpenBSD और NetBSD tcshपर और डेबियन GNU / Linux में परीक्षण किया गया bash


के साथ sed:

में tcshएक ओएस एक्स पर, निम्नलिखित sedटुकड़ा एक साथ के साथ इस्तेमाल किया जा सकता printf, के रूप में न तो sedहै और न ही echoसंभाल \rजीएनयू की तरह विशेष तरीके से करता है:

sed `printf 's/\r$//g'` input > output

के साथ tr:

एक अन्य विकल्प है tr:

tr -d '\r' < input > output

के बीच अंतर sedऔर tr:

ऐसा प्रतीत होता है कि trइनपुट फ़ाइल से एक अनुगामी न्यूलाइन की कमी को बरकरार रखता है, जबकि sedOS X और NetBSD (लेकिन OpenBSD या GNU / Linux पर नहीं) एक बहुत ही आकर्षक फ़ाइल के अंत में एक अनुगामी न्यूलाइन सम्मिलित करता है, भले ही इनपुट कोई भी गायब हो अनुगामी \rया \nफ़ाइल के बहुत अंत में।


परिक्षण:

यहां कुछ नमूना परीक्षण किए गए हैं जिनका उपयोग आपके सिस्टम पर इस काम को सुनिश्चित करने के लिए किया जा सकता है, उपयोग printfऔर hexdump -C; वैकल्पिक रूप से, का od -cउपयोग भी किया जा सकता है यदि आपका सिस्टम गायब है hexdump:

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 

0

मैंने इसके लिए अजगर का उपयोग किया है, यहां मेरा कोड;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

0

हालाँकि यह एक पुरानी पोस्ट है, हाल ही में मैं इसी समस्या को लेकर आया हूँ। जैसा कि मेरे पास सभी फ़ाइलों के अंदर / tmp / blah_dir / का नाम बदलना था, क्योंकि इस निर्देशिका में प्रत्येक फ़ाइल में "/ r" अनुगामी चरित्र (दिखा रहा है? "

मैं एक ही नाम (किसी भी चरित्र को पीछे किए बिना) के साथ अंतिम फ़ाइल को सहेजना चाहता था। सीड के साथ, समस्या आउटपुट फ़ाइल नाम थी जिसे मुझे कुछ और (जो मैं नहीं चाहता था) का उल्लेख करने की आवश्यकता थी।

मैंने अन्य विकल्पों की कोशिश की जैसा कि यहाँ सुझाया गया है (कुछ सीमाओं के कारण dos2unix नहीं माना जाता है) लेकिन काम नहीं किया।

मैंने अंत में "awk" के साथ प्रयास किया, जिसमें मैंने परिश्रम के रूप में "\ r" का उपयोग किया और पहला भाग लिया :

चाल है:

echo ${filename}|awk -F"\r" '{print $1}'

स्क्रिप्ट स्निपेट के नीचे मैंने उपयोग किया (जहां मेरे पास सभी फ़ाइल में "\ r" पथ पर अनुगामी चरित्र के रूप में / tmp / blah_dir /) मेरी समस्या को ठीक करने के लिए था:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

नोट: यह उदाहरण बहुत सटीक नहीं है, हालांकि मैंने जो काम किया था, उसके करीब (केवल यहां मैंने जो किया उसके बारे में बेहतर विचार देने के लिए उल्लेख करना)


0

मैंने इस शेल-स्क्रिप्ट को \ r वर्ण को हटाने के लिए बनाया है। यह सोलारिस और रेड-हैट में काम करता है:

#!/bin/ksh

LOCALPATH=/Any_PATH

for File in `ls ${LOCALPATH}`
do
   ARCACT=${LOCALPATH}/${File}
   od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
   printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
   rm ${ARCACT}.TMP
done

exit 0

-1

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

$ echo $(cat input) > output

पता नहीं क्यों किसी ने '-1' दिया। यह एक पूरी तरह से अच्छा जवाब है (और केवल एक ही मेरे लिए काम करता है)।
फ्रैक्टलस्पेस

1
ओह, माफ करना, यह मैं था। रुको, देखो, यह वास्तव में '\ r' के लिए काम नहीं करता है!
वायाचेस्लाव रोडियोनोव

1
@ फ्रैक्टलस्पेस यह एक भयानक विचार है! यह पूरी तरह से फ़ाइल में सभी रिक्ति को मिटा देता है और शेल द्वारा व्याख्या के अधीन फ़ाइल की सभी सामग्री को छोड़ देता है। एक ऐसी फ़ाइल के साथ इसे आज़माएं जिसमें एक पंक्ति हो a * b...
टॉम फेनेच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.