असमर्थ खोज के नाम जो AWK / पायथन / बैश से यादृच्छिक क्रम में तीन 7s शामिल

वोट
0

मैं नाम जो यादृच्छिक क्रम में तीसरे नंबर 7 शामिल खोजने की जरूरत है।

मेरे प्रयास

हम पहला नाम जो सात शामिल नहीं है खोजने की जरूरत है

ls | grep [^7]

फिर, हम पूरे अंतरिक्ष से इन मैचों को दूर कर सकता है

ls [remove] ls | grep [^7]

मेरी छद्म कोड में समस्या ही जल्दी से दोहराने के लिए शुरू होता है।

आप नाम जो यादृच्छिक क्रम में तीन 7s शामिल AWK / पायथन / बैश से कैसे मिल सकती है?

[संपादित करें] नाम पत्र के किसी भी संख्या शामिल कर सकते हैं और यह तीन 7s की शब्द हैं।

12/03/2009 को 16:11
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
7

मैं "यादृच्छिक क्रम" के बारे में हिस्सा समझ में नहीं आता। आप "आदेश" जब वह एक ही टोकन कि दोहराता है के बीच में कैसे फ़र्क करते हैं? "A7b7" 7s के क्रम में "c7d7" से अलग है?

वैसे भी, यह काम करना चाहिए:

 ls *7*7*7*

यह सिर्फ है खोल समस्या को हल करते हैं, लेकिन शायद मैं ठीक से समझ में नहीं आया।

संपादित करें: ऊपर गलत है, यह चार से अधिक 7s जो चाहता था नहीं है के साथ मामलों में शामिल हैं। यह मानते हुए पार्टी है, और विस्तारित ग्लोबिंग सक्षम किया गया है, इस काम करता है:

ls *([^7])7*([^7])7*([^7])7*([^7])

यह "शून्य या अधिक वर्ण जो नहीं सात कर रहे हैं, एक सात के बाद, शून्य या अधिक अक्षर हैं जो सात नहीं हैं के बाद", और इतने पर के रूप में पढ़ता है। यह समझना महत्वपूर्ण है कि तारांकन एक है महत्वपूर्ण है उपसर्ग ऑपरेटर यहाँ, अभिव्यक्ति पर काम ([^7])जो "7 को छोड़कर किसी भी चरित्र" का मतलब है।

12/03/2009 को 16:15
का स्रोत उपयोगकर्ता

वोट
5

मैं तुम्हें फ़ाइलों को ठीक तीन 7 के होते हैं, लेकिन अब नहीं लगाना चाहते हैं अनुमान लगा रहा हूँ। साथ जीएनयू ग्रेप का उपयोग regexp स्विच फैली ( -E):


ls | grep -E '^([^7]*7){3}[^7]*$'

चाल करना चाहिए।

मूल रूप से इस बात का 3 घटनाओं, तो पूरी स्ट्रिंग भर के "नहीं 7" एक गुच्छा (^ और $ शुरुआत और पैटर्न के अंत में क्रमशः) "नहीं 7 एक 7 के बाद" से मेल खाता है।

12/03/2009 को 16:35
का स्रोत उपयोगकर्ता

वोट
2

एक पर्ल समाधान:

$ ls | perl -ne 'print if (tr/7/7/ == 3)'
3777
4777
5777
6777
7077
7177
7277
7377
7477
7577
7677
...

(मैं 4 अंकों की संख्या के साथ एक निर्देशिका। 1777 और 2777 अस्तित्व में नहीं है के लिए होता है। :-)

12/03/2009 को 17:53
का स्रोत उपयोगकर्ता

वोट
2

कुछ इस तरह:

printf '%s\n' *|awk -F7 NF==4
12/03/2009 को 17:31
का स्रोत उपयोगकर्ता

वोट
1

या बजाय एक ही ग्रेप में यह कर के, एक ग्रेप का उपयोग 4 या अधिक 7s को फ़िल्टर करने के 3 या अधिक 7s और एक अन्य के साथ फ़ाइलें खोजने के लिए।

ls -f | egrep '7.*7.*7' | grep -v '7.*7.*7.*7'

आप कम से खोल ग्लोब में काम से कुछ को स्थानांतरित कर सकता है

ls -f *7*7*7* | grep -v '7.*7.*7.*7'

हालांकि, अगर वहाँ फ़ाइलें जो उस पैटर्न तो उत्तरार्द्ध क्योंकि ग्लोब आकार के लिए अंतर्निहित सीमा के काम नहीं करेगा से मेल की एक बड़ी संख्या है।

'Ls' में '-f' परिणाम छँटाई से 'ls' को रोकने के लिए है। अगर वहाँ निर्देशिका में फ़ाइलों की एक बड़ी संख्या है तो तरह समय काफी ध्यान देने योग्य हो सकता है।

इस दो कदम फिल्टर प्रक्रिया मुझे लगता है, [^ 7] पैटर्न का उपयोग की तुलना में अधिक समझा जा सकता है,।

इसके अलावा, यहां, एक अजगर स्क्रिप्ट के रूप में समाधान है, क्योंकि आपको लगता है कि एक विकल्प के रूप के लिए कहा।

import os
for filename in os.listdir("."):
    if filename.count("7") == 4:
        print filename

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

12/03/2009 को 17:39
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more