\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
पहचान \r
MacOS पर। इस मामले में केवल 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
इनपुट फ़ाइल से एक अनुगामी न्यूलाइन की कमी को बरकरार रखता है, जबकि sed
OS 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
...