उन फ़ाइलों को खोजने के लिए grep जिसमें ^ M (विंडोज कैरिज रिटर्न) है


71

मैं लिनक्स का उपयोग करता हूं। हजारों कॉन्फ़िगरेशन फ़ाइलों में कहीं न कहीं एक pesky ^ M (विंडोज कैरिज रिटर्न) छिपा है, और मुझे इसे ढूंढना है, क्योंकि यह सर्वर को विफल कर देता है।

मुझे कैसे पता चलेगा ^ विन्यास फाइल से भरा पदानुक्रम के बीच एम?

मुझे लगता है कि मैं bash कमांड लाइन पर ^ M दर्ज नहीं कर सकता। लेकिन मेरे पास यह एक पाठ फ़ाइल में है जिसे मैंने m.txt कहा है



खिड़कियाँ ^ M ^ J
बार्लोप होंगी

2
"मैं बैश कमांड लाइन पर ^ M दर्ज नहीं कर सकता"। हाँ तुम कर सकते हो। नियंत्रण-वी कंट्रोल-एम की कोशिश करें
हेन्स

जवाबों:


90
grep -r $'\r' *

-rपुनरावर्ती खोज के लिए और $''बाश में सी-स्टाइल भागने के लिए उपयोग करें ।

अधिक, यदि आप सुनिश्चित हैं कि यह पाठ फ़ाइल है, तो इसे चलाने के लिए सुरक्षित होना चाहिए

tr -d $'\r' < filename

\rकिसी फ़ाइल में सभी को निकालने के लिए ।

जीएनयू का उपयोग करते हैं sed, -iयथा-स्थान संपादित प्रदर्शन कर सकते हैं, तो आप वापस लिखने के लिए की जरूरत नहीं होगी:

sed $'s/\r//' -i filename

10
@ नाइसोल: आप ^ V ^ M दबाकर कमांड लाइन पर ^ M दर्ज कर सकते हैं, लेकिन इसका उपयोग करना बेहतर है $'\r'
डेनिस विलियमसन

महान, यह काम करता है! ^ V ^ M चाल के लिए भी धन्यवाद :-)
निकोलस राउल

5
Cygwin के तहत, -U को यह कार्य करने के लिए आवश्यक है। एंड-एन आपको लाइन नंबर बताएगा: grep -r -U -n -e $ '\ r'
Rainer Blome

4
केवल फ़ाइल नाम देखने के लिए grep कमांड में एक -l जोड़ें। और आप मिलान लाइनों के साथ बमबारी कर सकते हैं।
ब्रेंडन बर्ड

1
@uprego सुनिश्चित नहीं है कि आप उन्हें अभी समझते हैं, लेकिन फ़िजी और अन्य, खोज मैनहोम $'में पहली हिट पढ़ें bash(1), मूल रूप से, आप इसे देख सकते हैं जैसे कि आप सी शाब्दिक स्ट्रिंग लिख रहे थे। के रूप में command < filename, के उपयोग के लिए <या पुनर्निर्देशन> कहा जाता है , यह पहली बार है जब मैंने किसी को इसे अधिक अभिव्यक्ति के रूप में देखा है । खोजें REDIRECTIONमें bash(1)
लिविबेट्टर

12

जब मैंने कोशिश की, तो मैं बता सकता था कि यह काम करने की तरह था, लेकिन लाइनें खाली मुद्रण कर रही थीं। विकल्प में जोड़ें:

--color=never

यदि आपको यह मुद्दा मिलता है, तो मुझे लगता है कि यह चरित्र के साथ हस्तक्षेप करने वाले रंग को उजागर करने के लिए भागने के \rपात्र हैं।


2

यदि आपके सर्वर में बैश शेल नहीं है, तो -fविकल्प grepएक तैयार फ़ाइल युक्त के साथ संयोजन में, विकल्प का उपयोग करने के लिए है \r

फ़ाइल बनाने के लिए:

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

वास्तव में खोज करने के लिए

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

या आप थोड़े आलसी और थोड़े टाइप * हो सकते हैं।

$ grep -f /tmp/cr *

विकल्प पर कि पैटर्न मिलान करने के लिए, प्रति पंक्ति एक में शामिल है एक फ़ाइल निर्दिष्ट करने के लिए प्रयोग किया जाता है। इस मामले में केवल एक पैटर्न है।-f filenamegrep


2

यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप वास्तव में क्या चाहते हैं, यूनिक्स एलएफ ( \x0a) मानक के लिए सभी लाइन-एंडिंग को सामान्य करना है । यह केवल CRs ( \xod) को नेत्रहीन हटाने के समान नहीं है ।

यदि आपके पास कुछ मैक फाइलें हैं, जिनके चारों ओर सिर्फ नई लाइनों के लिए सीआर का उपयोग किया जाता है, तो आप उन फाइलों को नष्ट कर देंगे। (हां, मैक लगभग 20 वर्षों से एलएफ का उपयोग करने वाले हैं, लेकिन अभी भी (2019 में) कई मैक ऐप हैं जो सीआर का उपयोग करते हैं।

आप किसी भी प्रकार की न्यूलाइन को बदलने के लिए पर्ल के \R लाइनब्रेक एस्केप का उपयोग कर सकते हैं \n

perl -i.bak -pe 's/\R/\n/g' $your_file

यह इन-जगह के साथ LINEBREAK किसी भी प्रकार की जगह लेंगे \nमें $your_file, में मूल फ़ाइल की एक बैकअप रखने ${your_file}.bak


1

एंड-ऑफ़-लाइन वर्णों पर grep का उपयोग करने के लिए, मुझे लगता है कि आपको grep को बताना होगा फ़ाइल बाइनरी है।

-l (अक्षर L) केवल फ़ाइल नाम को प्रिंट करने के लिए है

-पीएल प्रतिक्षेपक के लिए है (इसलिए \ x0d को \ r या ^ M पर ट्रांसफॉर्म किया गया है)

grep -l --binary -P '\x0d' *

0

यदि आप एक मैक पर हैं और होमब्रे का उपयोग करते हैं , तो आप कर सकते हैं:

brew install tofrodos
fromdos file.txt

सभी Windows कैरिज रिटर्न को file.txt से हटाने के लिए

विंडोज कैरिज रिटर्न पर वापस जाने के लिए,

todos file.txt

फ़ोल्डर में खोजने के लिए और डॉस से आने वाली सभी फाइलों को साफ करने के लिए, इस कमांड को चलाएं: खोजें। -Type f -name "* .java" | xargs fromdos
Taiko

0

नियमित अभिव्यक्ति शैली में, विभिन्न नई कहानियाँ:

विंडोज (CR LF)
\r\n

यूनिक्स (LF)
\n

चूंकि \r\nअनुक्रम काफी अनोखा है, मुझे लगता है कि आपको इस तरह से खोज करने में सक्षम होना चाहिए?

चीजों को बदतर बनाने के लिए Macs के पास newline की जगह सिर्फ 'r' हुआ करता था। मैं इसे सत्यापित नहीं कर सकता, लेकिन मुझे नहीं लगता कि MacOSX पीढ़ी ऐसा करती है।

पुराने Macs (CR)
\r


निर्देशिका में जिसमें m.txt है, grep "\r\n" *कोई परिणाम नहीं देता है। egrep -e "\r\n" *न तो परिणाम के लिए और न हीgrep -E "\r\n" *
निकोलस राउल

@nicolas आह, मुझे गलत समझा गया .. तुम्हारा मतलब था सीआर केवल \rमेरा बुरा। एक पूर्ण विंडोज़ न्यूलाइन वास्तव में \r\nया CRLF है
जेफ एटवुड

0

पिछले उत्तरों के बाद, 'tr' विधि अच्छी है:

533 $ अगर [[-n " tr -cd "\r" <~/.bashrc"]]; फिर प्रतिध्वनि "डॉस"; और प्रतिध्वनि "UNIX"; फाई

यूनिक्स

534 $ अगर [[-n " tr -cd "\r" <dosfile.txt"]]; फिर प्रतिध्वनि "डॉस"; और प्रतिध्वनि "UNIX"; फाई

करने योग्य

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