ग्रीप के साथ एक पंक्ति के अंत में पैटर्न का पता लगाना


64

यदि मैं करता हूँ:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part

यदि मैं .rarकेवल फाइलों को सूचीबद्ध करना चाहता हूं , और मैं grep का उपयोग करता हूं , तो यह मुझे भी .rar.partफाइलें दिखाएगा , मेरी इच्छा नहीं है।
मैं इसका उपयोग कर रहा हूं findया ls **/*.rarजैसा कि इस धागे में बताया गया है और वे ठीक काम करते हैं, लेकिन मैं यह सीखना चाहूंगा कि क्या यह संभव है grep

मैंने कोशिश की है (के बारे में सोच EOL):

ls -R | grep ".rar\n"

कोई परिणाम नहीं के साथ।
मुझे लगता है कि समस्या यह है कि अगर रेखा के अंत में ग्रीपिंग पाया जाता है , तो पता चलता है , लेकिन मुझे यकीन नहीं है।

कोई मदद यहाँ, कृपया?


आप grepइस मामले में क्यों इस्तेमाल करना चाहेंगे ? क्यों नहीं find?
देवनाल

1
@ देवनुल, यह जानना कि पैटर्न का पता कैसे लगाया जाए जो केवल एक पंक्ति के अंत में हो, कई मामलों में उपयोगी हो सकता है। उदाहरण के लिए: पोर्टेबिलिटी, एम्बेडेड-सिंपल लिनक्स के साथ राउटर में उपयोग, विंडोज के लिए UnxUtils के साथ उपयोग (इसका findकमांड विंडोज के साथ संघर्ष करता है) और ... सीखने ;-)। यह सवाल "डीर में फाइलों को सूचीबद्ध करने" के बारे में नहीं है (यह सिर्फ एक कस्टम उदाहरण है) बल्कि "
ग्रीप

1
ईमानदारी से, यदि आप अपने विभाजक होने के लिए एक पंक्ति के अंत में गिनती कर रहे हैं, तो आपको उपयोग करना चाहिए ls -1R
मिकसेर्व

1
और तुम भी जरूरत नहीं है grep। मेरा जवाब देखिए।
mikeserv

@ बाइक, -1Rस्विच के बिना क्या हो सकता है । जाहिरा तौर पर परिणाम समान हैं।
शोपाजो डे एरियेरेज़

जवाबों:


88

$लंगर एक पंक्ति के अंत से मेल खाता है।

ls -R | grep '\.rar$'

आप इसके लिए भी उपयोग कर सकते हैं find:

find . -name '*.rar'

मुझे एहसास नहीं था " grep में भाग जाने की जरूरत है। क्या इसे वाइल्ड कार्ड माना जाता है?
thebunnyrules

1
@thebunnyrules "।" regex में किसी भी वर्ण का अर्थ है।
जोर्डनम

10

अपने प्रश्न के अलावा कृपया ध्यान दें कि .rar".rar" से न केवल मेल खाता है, बल्कि इससे पहले हर एक वर्ण (सहित .) से मेल खाता है rar। इस मामले में शायद कोई समस्या नहीं है, लेकिन .regexes में बच जाना चाहिए।

ls -R | grep "\.rar$"

क्या आपका मतलब पैटर्न .ascजैसा *ascहै? तो यह उदाहरण के लिए, से मेल खाएगी, whereverasc
सोपालाजो डे एरियेरेज़

2
@SopalajodeArrierez नहीं, यह वर्णों के प्रत्येक समूह से मेल नहीं खाता, लेकिन हर एक वर्ण, उदा xrar
हौके लैजिंग

5

आप grepएक शब्द सीमा पर शुरू होने वाले अपने स्ट्रिंग को देखने के लिए भी निर्देश दे सकते हैं । A .ऐसी सीमाओं में से एक है।

$ ls -R | grep '\brar$'

उदाहरण

कहो कि मेरे पास यह नमूना डेटा है।

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part

यह कमांड केवल फ़ाइल को .rarएक्सटेंशन के साथ ढूंढेगा।

$ ls -R | grep '\brar$'
afile.rar

यह कैसे काम करता है?

मेटाचैकर \bकेयर और डॉलर चिह्न की तरह एक लंगर है। यह एक ऐसी स्थिति से मेल खाता है जिसे "शब्द सीमा" कहा जाता है। यह मैच जीरो-लेंथ है।

स्थिति जहां यह काम नहीं करेगा

यदि आपके पास इनका नाम रखने वाली फाइलें हैं, तो blah-rarइनका भी पता लगाया जाएगा।

$ ls -R | grep '\brar$'
afile-rar
afile.rar

ऐसा इसलिए है क्योंकि अल्फ़ान्यूमेरिक्स के अलावा वर्णों को आम तौर पर सीमा वर्ण माना जाता है, और इसलिए यह दृष्टिकोण पिछले जाएगा।


पहली नजर में एक जैसा ही लगता है, लेकिन यह वास्तव में थोड़ा अलग है। धन्यवाद, @ एसएलएम अगर मैं "सरल उद्धरणों के बजाय दोहरे उद्धरण चिह्नों का उपयोग करता हूं तो क्या यह परेशान करता है ?
शाल्पाजो डी एरियेरेज़

1
@SopalajodeArrierez - nope किसी भी तरह से काम करता है। यह किसी भी फाइल को ढूंढेगा जिसका नाम w / शुरू हो सकता है .rar। लेकिन ये उपयोग के साथ एक मुद्दा नहीं होगा ls -R। यदि आप उपयोग करने के लिए हुआ है ls -Ra
slm

क्या आप में से कोई भी जनता को इस मामूली अंतर को समझाने में दिलचस्पी लेगा?
हौके लैजिंग

@ मेरे उदाहरण में -Pस्विच grep। यह तर्क की पीसीआरई व्याख्या को ट्रिगर करता है।
स्लम

1
@SopalajodeArrierez - अगर किसी फ़ाइल में एक नया वर्ण ( \n) है जो एक कानूनी चरित्र है। ls -1Rफ़ाइलों की परवाह किए बिना एक एकल स्तंभ में प्रदर्शित करने के लिए बाध्य करेगा।
slm

0

बस करो :

ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"

तुम grepसब पर जरूरत नहीं है ।

नोट: उपरोक्त काम करता है ... सिवाय इसके अभी भी कम से कम हो जाता हैafile-rarऔर मुझे समझ नहीं आता कि क्यों। मैं इसे यहाँ छोड़ दूँगा, लेकिन मुझे इस पर गर्व नहीं है। किसी भी मामले में, जैसा कि दूसरों ने कहा है:

find . '*.rar'

यह फ़ाइलों के नाम xrarया ब्लॉक नहीं किया afile-rar
स्लम

मैं अभी भी आउटपुट में अन्य फ़ाइलों को प्राप्त कर रहा हूं।
स्लम

@ एसएलएम क्या अन्य फाइलें? मुझे लगता है कि यह कारण हो सकता है कि वे बहुत कम हैं। मैंने सिर्फ उस पर ध्यान दिया। मैंने वो भी ठीक कर दिया।
मिकसेर्वेर

फ़ाइलें afile-rarऔर xrarअभी भी आउटपुट में शामिल की जा रही हैं। आपके नवीनतम मॉड के साथ कोई बदलाव नहीं। पेस्की समस्या नहीं? यह मजेदार नियमित तरीकों 8-) के बिना इसे हल करने की कोशिश कर रहा है
SLM

@ एसएलएम हाँ, यह मैं यहाँ आ रहा हूँ। मुझे समझ नहीं आता कि क्यों -dashहो जाता है। वह xrarचीज जो मैं संभाल सकता था, लेकिन -dash.मुझे समझ में नहीं आ रहा है-dash.
mikeserv

0

$ काम को अंत-पंक्ति के रूप में बनाने के लिए एकल उद्धरणों का उपयोग करें। यदि आप कुछ चर भी प्राप्त करना चाहते हैं, तो नीचे दिए गए दोहरे और एकल उद्धरणों के संयोजन का उपयोग करें:

grep "$var"'$'

मेरी पिछली पोस्ट यह कहते हुए हटा दी गई थी कि यह डुप्लिकेट है। मुझे समझाएं कि यह कैसे अलग है।

अन्य पदों में दोहरे उद्धरण चिह्नों का ""पूर्ण उपयोग, या एकल उद्धरणों का पूर्ण उपयोग का उल्लेख है ''। उन दोनों की अपनी सीमाएँ हैं। इसे समझाते हुए।

सभी दोहरे उद्धरण चिह्नों के साथ समस्या निम्नलिखित है: grep "pattern$"निम्नलिखित त्रुटि:Illegal variable name.

और सभी एकल उद्धरणों का उपयोग करना काम करता है, लेकिन यदि आप चर प्रतिस्थापन चाहते हैं, तो सभी एकल उद्धरण काम नहीं करेंगे । उदाहरण के लिए:

यदि मेरे पास स्ट्रिंग है A_BOOK, तो फ़ाइल में अन्य स्ट्रिंग सहित FILE।

$ cat FILE
A_BOOK
B_BOOK_NOT_LAST
C_BOOK

अगर मैंने BOOK को एक वैरिएबल BK में सेट किया है

set BK = BOOK

यदि मैं सभी दोहरे उद्धरण चिह्नों के साथ मिलता हूं, तो मुझे निम्न त्रुटि मिलती है grep "${BK}$" FILE*:: चर प्रतिस्थापन के लिए 1 $, पैटर्न के अंत के लिए 2 ( अवैध चर नाम )।

अगर मैं सभी एकल उद्धरणों के साथ जीआरपी करता हूं, तो चर प्रतिस्थापन नहीं होता है। grep '${BK}$' FILEकुछ नहीं देता

यदि मैं दोहरे और एकल उद्धरणों के संयोजन का उपयोग करता हूं, तो मुझे वह मिलता है जिसकी मुझे उम्मीद है। चर प्रतिस्थापन के लिए डबल उद्धरण, और पैटर्न के अंत के लिए एकल उद्धरण।

$ grep "${BK}"'$'  # << gives expected output
A_BOOK
C_BOOK

लगता है कि आप csh का उपयोग कर रहे हैं। "foo$"वाक्य रचना श और परिवार पर ठीक काम करता है।
ओलरिन

हाँ ओलरिन। मैं tsh का उपयोग कर रहा हूँ। इशारा करने के लिए धन्यवाद।
user274900

0

यदि उपरोक्त के बाद और कुछ भी काम नहीं करता है, तो यह लाइन-एंडिंग के कारण हो सकता है। ठीक करने के लिए, करें: dos2unix pr0n.txtऔर grepफिर से करें।

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