केस-असंवेदनशील खोज जाग में


20

मुझे awk का उपयोग करके एक कीवर्ड की खोज करने की आवश्यकता है, लेकिन मैं केस-असंवेदनशील (गैर-संवेदनशील केस) खोज करना चाहता हूं।

मुझे लगता है कि सबसे अच्छा तरीका है खोज शब्द ("कुंजी शब्द") और लक्ष्य रेखा को जागृत करना जो एक ही समय में पढ़ रहे हैं। से इस सवाल का मैं कैसे उपयोग करने के लिए toupperसभी अपरकेस में मुद्रित करने के लिए है, लेकिन मैं कैसे एक मैच में इसका इस्तेमाल करने की वजह से है कि इसका जवाब सिर्फ शो मुद्रण और एक चर में अपरकेस पाठ नहीं छोड़ता पता नहीं है।

इस इनपुट को देखते हुए एक उदाहरण दिया गया है:

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla

मुझे यह आउटपुट चाहिए:

I want all 
these text and numbers 123
and chars !"£$%&
as output

यह वही है जो मेरे पास है, लेकिन मुझे नहीं पता कि इसमें कैसे जोड़ना है toupper:

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt

जवाबों:


23

/&&&key word&&&/स्पष्ट रूप $0से वर्तमान लाइन का उपयोग करके किसी अन्य अभिव्यक्ति द्वारा एक पैटर्न (यानी ) से मिलान करने के लिए अपनी अभिव्यक्ति को बदलें :

tolower($0) ~ /&&&key word&&&/

या

toupper($0) ~ /&&&KEY WORD&&&/

मतलब आपके पास है

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt

आपको एकल उद्धरणों की आवश्यकता है क्योंकि $0, BEGIN ब्लॉक को हटाया जा सकता है क्योंकि चर को डिफ़ॉल्ट रूप से ""या 0पहले उपयोग पर प्रारंभ किया जाता है , और {print}डिफ़ॉल्ट कार्रवाई होती है, जैसा कि नीचे टिप्पणी में बताया गया है।


4
ध्यान दें कि आप इसे सरल बना सकते हैं awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txtBEGINब्लॉक की कोई आवश्यकता नहीं है और चूंकि डिफ़ॉल्ट कार्रवाई प्रिंट करना है, p;पर्याप्त है।
terdon

1
"एक BEGINब्लॉक के लिए कोई ज़रूरत नहीं है " क्योंकि एक असंगठित चर गलत के रूप में मूल्यांकन करता है।
ग्लेन जैकमैन

आशाओं के लिए धन्यवाद। मैं आमतौर पर अपने जवाब को मूल में न्यूनतम बदलावों तक सीमित करने की कोशिश करता हूं, लेकिन यह सच है कि नया परिणाम बहुत तंग और काफी पठनीय है।
14

2
बस एक नोट: tolowerप्राचीन (या नहीं तो प्राचीन) awk संस्करणों (पूर्व: AIX) सिस्टम पर मौजूद है, लेकिन toupperहमेशा ^ ^ उपलब्ध नहीं है।
ओलिवियर दुलैक

16

gawk में एक IGNORECASEअंतर्निहित चर होता है, जो अगर नॉनज़रो पर सेट होता है, तो सभी स्ट्रिंग और नियमित अभिव्यक्ति की तुलना केस-इनसेटिव के रूप में होती है। आप इसका उपयोग कर सकते हैं:

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

आदि gawk, हालांकि, यह विशिष्ट है , लेकिन मुझे यह meuh द्वारा (अधिक पोर्टेबल) विकल्प की तुलना में अधिक पठनीय लगता है। फिर चाहे वह कोई समस्या हो, पूरी तरह से आप पर निर्भर है।


1
मैं अपने सबसे बड़े gawk प्रोजेक्ट में से एक में वर्षों से awk का समर्थन करना चाहता हूं, लेकिन केस असंवेदनशील खोज की कमी से यह ट्रिगर होता है कि gawk ने मामले को असंवेदनशील बना दिया है क्योंकि असंवेदनशील सामान रन चलाता है। gensub अन्य gawk केवल सुविधा है जो awk में बदलने के लिए बहुत कठिन थी। लेकिन gawk को हमेशा कुछ मशीनों और वितरणों पर डिफ़ॉल्ट रूप से स्थापित नहीं किया जाता है, हालांकि यह लगभग हमेशा उपलब्ध होता है, लेकिन यह दुर्भाग्यपूर्ण है कि 2016 तक वे इस तरह के मानक उपकरणों की कार्यक्षमता का विस्तार करने के लिए awk और पॉज़िक्स को बदल नहीं सके।
छिपकली

3
@ छिपकली: यह विस्तार न करने का पूरा बिंदु है: इसे मानक रखें। अन्यथा आप सिर्फ एक और मानक बनाते हैं, और फिर आप दोनों के बीच कुछ अक्षमताएं होती हैं (वे ऐसा करते हैं, लेकिन मानक परिवर्तनों को न्यूनतम रखने की कोशिश करते हैं ... फिर भी, कई मानक कंप्यूटिंग के मुख्य विपत्तियों में से एक हैं)
ओलिवियर दुलैक

2
मैं सहमत नहीं हूँ। सावधानीपूर्वक निष्पादन के साथ, आप सभी विरासत विधियों का समर्थन करते हुए विस्तार का परिचय दे सकते हैं, क्या होता है यदि आप ऐसा करने में विफल रहते हैं कि सामान केवल समय के साथ अप्रासंगिकता में दूर होने लगता है। कंप्यूटिंग में सब कुछ विकसित होता है, चाल एक बहुत ही स्थिर विश्वसनीय विकास को बनाए रखने के लिए है। बैश ऐसा करने का एक अच्छा उदाहरण है, जो सुपर विश्वसनीय है और बस नई विशेषताओं को जोड़ते हैं, यह 'दो मानक' नहीं है, जैसे कि, जो समर्थित है उसका उपयोग करें, और एक बार जब विश्व स्तर पर परिवर्तन हो गए हैं तो आप नई सुविधाओं का उपयोग करना शुरू कर सकते हैं क्योंकि केवल परिणाम सबसे पुरानी विरासत प्रणालियों का समर्थन नहीं होगा।
छिपकली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.