\rयूनिक्स में एक फ़ाइल से सभी गाड़ी के रिटर्न को निकालने का सबसे सरल तरीका क्या है ?
\rयूनिक्स में एक फ़ाइल से सभी गाड़ी के रिटर्न को निकालने का सबसे सरल तरीका क्या है ?
जवाबों:
मैं तुम्हें मतलब कैरिएज रिटर्न (ग्रहण करने के लिए जा रहा हूँ 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
यदि आपके पास कोई भी उपकरण आपके बॉक्स पर स्थापित नहीं है , तो आपको फ़ाइलों को बदलने की कोशिश करने से बड़ी समस्याएं हैं :-)
\rकेवल GNU sed के साथ काम करता है, अन्यथा आप यह कर सकते हैं:sed `echo "s/\r//"`
sedहै और न ही echoपहचान \rMacOS पर। इस मामले में केवल printf "\r"काम करने के लिए प्रकट होता है।
sed "s/$(printf '\r')\$//"
$तरह से उपसर्ग कर सकते हैं : sed $'s@\r@@g' |od -c (लेकिन अगर आप इसे बदलने की \nआवश्यकता होगी तो इसे
tr -d '\r' < infile > outfile
देखें ट्र (1)
trसमर्थन नहीं करता है \r, तो '\015'शायद या एक शाब्दिक '^M'(कई टर्मिनलों पर कई गोले में, ctrl-V ctrl-M एक शाब्दिक ctrl-M चरित्र का उत्पादन करेगा)।
outfile = infile?
someProg <in >out && mv out in:।
पुराना स्कूल:
tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
लिनक्स पर सबसे सरल तरीका है, मेरी विनम्र राय में,
sed -i 's/\r$//g' <filename>
मजबूत उद्धरण प्रतिस्थापन ऑपरेटर के आसपास 's/\r//'हैं आवश्यक । उनके बिना शेल \rएक एस्केप + आर के रूप में व्याख्या करेगा और इसे एक सादे तक कम करेगा r, और सभी निचले मामले को हटा देगा r। यही कारण है कि रोब द्वारा 2009 में ऊपर दिया गया जवाब काम नहीं करता है।
और /gसंशोधक को जोड़ने से यह सुनिश्चित होता है कि कई \rको भी हटा दिया जाएगा, और केवल पहला ही नहीं।
sed -i s/\r// <filename>या सोमसुख; देखें man sedया वेब पर उपलब्ध जानकारी के उपयोग के संबंध में धन sed।
इंगित करने के लिए एक चीज उपरोक्त में "गाड़ी वापसी" का सटीक अर्थ है; यदि आप वास्तव में एकल नियंत्रण चरित्र "कैरिज रिटर्न" का मतलब रखते हैं, तो उपरोक्त पैटर्न सही है। यदि आपका मतलब है, अधिक आम तौर पर, सीआरएलएफ (गाड़ी वापसी और एक लाइन फीड, जो कि विंडोज के तहत लाइन फीड कैसे लागू की जाती है), तो आप शायद \r\nइसके बजाय बदलना चाहते हैं । लिनक्स / यूनिक्स में नंगे लाइन फीड (न्यूलाइन) हैं \n।
s/\r//OS X पर गाड़ी के रिटर्न को हटाने के लिए प्रतीत नहीं होता है, ऐसा लगता है कि rइसके बजाय शाब्दिक वर्ण को हटा दिया गया है। मुझे यकीन नहीं है कि ऐसा क्यों है। हो सकता है कि स्ट्रिंग को उद्धृत करने के तरीके से इसका कुछ लेना-देना हो? वर्कअराउंड के रूप में, काम करने के लिए लगता है की CTRL-V + CTRL-Mजगह का उपयोग कर \r।
यदि आप एक वीआई उपयोगकर्ता हैं, तो आप फ़ाइल को खोल सकते हैं और गाड़ी का रिटर्न निकाल सकते हैं:
:%s/\r//g
या साथ
:1,$ s/^M//
ध्यान दें कि आपको ctrl-v और फिर ctrl-m दबाकर ^ M टाइप करना चाहिए।
^M-s बिल्कुल नहीं। इसके आस-पास होने से एक टन कीस्ट्रोक्स होता है, जो कि विम के लिए नहीं बना है;)। मैं सिर्फ sed -iईओएल में सीआर को हटाने को सीमित करने के लिए , और फिर `-ई / \ r $ // g 'पर जाऊंगा।
कोई और सलाह देता है dos2unixऔर मैं दृढ़ता से इसकी सिफारिश भी करता हूं। मैं अभी और जानकारी प्रदान कर रहा हूं।
यदि स्थापित है, तो अगले चरण पर जाएं। यदि पहले से स्थापित नहीं है, तो मैं इसे इसके माध्यम से स्थापित करने की सलाह दूंगा yum:
yum install dos2unix
तब आप इसका उपयोग कर सकते हैं जैसे:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
यदि आप एक 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कमांड लाइन पर नाम का उपयोग उसी तरह से कर पाएंगे जैसे कि अन्य उदाहरणों में किया जाता है।
यहाँ बात है,
%0dगाड़ी वापसी चरित्र है। इसे यूनिक्स के साथ कंपैटिबल बनाने के लिए। हमें नीचे दिए गए कमांड का उपयोग करने की आवश्यकता है।
dos2unix fileName.extension fileName.extension
UNIX के लिए ... मैंने देखा है dos2unix हटाए गए यूनिकोड हेडर मेरी UTF-8 फ़ाइल बनाते हैं। गिट बैश (विंडोज़) के तहत, निम्न स्क्रिप्ट अच्छी तरह से काम करती है। यह sed का उपयोग करता है। ध्यान दें कि यह केवल लाइनों के सिरों पर गाड़ी-रिटर्न को हटाता है, और यूनिकोड हेडर को संरक्षित करता है।
#!/bin/bash
inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"
यदि आप एक एक्स वातावरण चला रहे हैं और एक उचित संपादक (विजुअल स्टूडियो कोड) है, तो मैं प्रतिगमन का पालन करूंगा:
विजुअल स्टूडियो कोड: लाइन एंडिंग कैसे दिखाएं
बस अपनी स्क्रीन के निचले दाएं कोने पर जाएं, दृश्य स्टूडियो कोड आपको फ़ाइल एन्कोडिंग और फ़ाइल के बाद लाइन कन्वेंशन के अंत दोनों दिखाएगा, बस एक साधारण क्लिक के साथ आप इसे चारों ओर स्विच कर सकते हैं।
बस लिनक्स वातावरण पर नोटपैड ++ के प्रतिस्थापन के रूप में दृश्य कोड का उपयोग करें और आप जाने के लिए तैयार हैं।
Notepad++कमांड का उपयोग करें Edit / EOL Conversion / Unix (LF)।
\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
%
हालाँकि यह एक पुरानी पोस्ट है, हाल ही में मैं इसी समस्या को लेकर आया हूँ। जैसा कि मेरे पास सभी फ़ाइलों के अंदर / 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
नोट: यह उदाहरण बहुत सटीक नहीं है, हालांकि मैंने जो काम किया था, उसके करीब (केवल यहां मैंने जो किया उसके बारे में बेहतर विचार देने के लिए उल्लेख करना)
मैंने इस शेल-स्क्रिप्ट को \ 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
आप बस यह कर सकते हैं:
$ echo $(cat input) > output
a * b...