awk repetition {n} काम नहीं कर रहा है


18

मैं पुनरावृत्ति प्रतीक {n} का उपयोग करके लाइनों को प्रिंट करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं कर रहा है। के लिये। उदाहरण के लिए, मैं उन सभी लाइनों को प्रिंट करना चाहता हूं जिनकी लंबाई 4 चार्ट लंबी है

 awk '/^.{4}$/' test_data

उपरोक्त कोड वह नहीं छाप रहा है। इसे कैसे ठीक करें ताकि मैं पुनरावृत्ति प्रतीक का उपयोग कर सकूं? मुझे पता है जैसे awk '/^....$/' test_dataऔरawk 'length ==3 ' test_data


3
आप किस वितरण का उपयोग कर रहे हैं? कौन सा जाग?
terdon

1
$ awk --v GNU Awk 3.1.7 $ बिल्ली / आदि / रेडहैट-रिलीज़ Red Hat Enterprise Linux सर्वर रिलीज़ 6.7 (सैंटियागो)
फॉरएवर लर्नर

2
मैं awk '/^.{4}+$/{print}' <<<$'foods\nbaarsz\nfooo' बिल्कुल 4 वर्णों से मेल खाना चाहता हूँ । जैसा कि आपने खुद बताया, awk 'length($0) == 4' test_dataलगभग सभी awkसंस्करणों के साथ संगत है ।
वैलेंटाइन बजरमी

4
करो awk --re-interval '/^.{4}$/' test_data या awk --posix '/^.{4}$/' test_dataकाम करो ?
स्टीलड्राइवर

थैंक्यू स्टीलड्राइव। इससे मेरी समस्या हल हो गई। Upvoted। धन्यवाद फिर से :)
हमेशा के लिए सीखने वाला

जवाबों:


19

के अनुसार फ़ीचर इतिहास: जीएनयू Awk उपयोगकर्ता मार्गदर्शिका , नियमित अभिव्यक्ति रेंज ऑपरेटरों के लिए समर्थन संस्करण 3.0 में जोड़ा गया है, लेकिन शुरू में आवश्यक स्पष्ट आदेश पंक्ति विकल्प

नई कमांड-लाइन विकल्प:

  • नई कमांड-लाइन विकल्प:
    • निर्माण के बारे में चेतावनी देने के लिए - पुराने विकल्प जो मूल संस्करण 7 में उपलब्ध नहीं हैं awk का संस्करण (V7 / SVR3.1 देखें)।
    • BWK awk से -m विकल्प। (ब्रायन उस समय भी बेल लेबोरेटरीज में थे।) इसे बाद में उनके awk और gawk दोनों से हटा दिया गया था।
    • Regexps में अंतराल के भाव प्रदान करने के लिए --re- अंतराल विकल्प (देखें Regexp ऑपरेटर्स)।
    • Thetraditional ऑप्शन को --compat (विकल्प देखें) के बेहतर नाम के रूप में जोड़ा गया था।

में gawk4.0,

अंतराल अभिव्यक्तियाँ डिफ़ॉल्ट नियमित अभिव्यक्तियों का हिस्सा बन गईं

चूंकि आप gawk3.x का उपयोग कर रहे हैं , इसलिए आपको उपयोग करने की आवश्यकता होगी

awk --re-interval '/^.{4}$/'

या

awk --posix '/^.{4}$/'

या (धन्यवाद @ StéphaneChazelas) यदि आप एक समाधान चाहते हैं जो पोर्टेबल है, तो उपयोग करें

POSIXLY_CORRECT=anything awk '/^.{4}$/'

(तब से --posixया --re-intervalअन्य awkकार्यान्वयन में त्रुटि का कारण होगा )।


धन्यवाद Steeldriver, आपके समय और मदद के लिए। उत्कीर्ण और एक उत्तर के रूप में स्वीकार किया
फॉरएवर लर्नर

4
इसका उपयोग करना बेहतर है POSIXLY_CORRECT=anything awk '/^.{4}/'क्योंकि यह पोर्टेबल कोड बनाता है ( --posixया --re-intervalअन्य awkकार्यान्वयन में त्रुटि का कारण होगा )।
स्टीफन चेजलस

हाय स्टीफन चेज़लस, जब मैंने कमांड जारी किया, तो $ POSIXLY_CORRECT = कुछ भी awk '/^.काउटलिंग 4' Chaट्स_टैड_डाटा, इसने सभी पंक्तियों को छाप दिया। तब मुझे एहसास हुआ कि पुनरावृत्ति के बाद कोई अंतिम डॉलर नहीं है। आपके इनपुट के लिए धन्यवाद। आपकी टिप्पणी और समाधान को देखकर। खेद है कि मैंने पुनरावृत्ति के बाद $ की चूक के कारण इसे पहले स्थान पर गलत समझा।
फॉरएवर लर्नर

20

ईआरईएस ( द्वारा या के रूप में इस्तेमाल किए गए नियमित रूप से विस्तारित एक्सप्रेशंस ) में शुरू में नहीं था । यह पहली बार बीआरईएस (के रूप में उपयोग कर रहे हैं शुरू की गई थी या ), लेकिन साथ वाक्य रचना कि पिछड़े पोर्टेबिलिटी नहीं तोड़ा।awkegrep{x,y}grepsed\{x,y\}

लेकिन जब इसे उस {x,y}वाक्य रचना के साथ ERE में जोड़ा गया था , तो यह पिछड़े पोर्टेबिलिटी को तोड़ देता था क्योंकि foo{2}RE पहले कुछ अलग मिलान कर रहा था।

इसलिए कुछ कार्यान्वयनों ने इसे नहीं करने के लिए चुना। आप पाएंगे कि /bin/awk, /bin/nawkऔर /bin/egrepसोलारिस पर अभी भी यह सम्मान नहीं करता है (आपको उपयोग करने की आवश्यकता है /usr/xpg4/bin/awkया /usr/xpg4/bin/grep -E)। फ़्रीबीएसडी के लिए awkऔर ब्रायन केरनिघन ( इन ) द्वारा बनाए गए केnawk आधार पर भीawkkawk

जीएनयू के लिएawk , अपेक्षाकृत हाल ही में (संस्करण 4.0) तक, आपको POSIXLY_CORRECT=anything awk '/^.{4}$/'इसे सम्मान देने के लिए इसके साथ कॉल करना था । mawkअभी भी यह सम्मान नहीं करता है

ध्यान दें कि ऑपरेटर केवल वाक्य रचना चीनी है। .{3,5}हमेशा ....?.?उदाहरण के लिए लिखा जा सकता है (हालांकि निश्चित रूप {3,5}से बहुत अधिक सुपाठ्य है, और इसके समकक्ष बहुत अधिक (foo.{5,9}bar){123,456}खराब होगा)।


धन्यवाद फिर से स्टीफन चेज़लस। क्षमा करें, मेरा बुरा, मैं शुरू में आपके उत्तर को समझने में असमर्थ था। बहुत बहुत धन्यवाद और उत्थान किया।
फॉरएवर लर्नर

6

यह GNU awk(gawk) के साथ अपेक्षित रूप से काम करता है :

$ printf 'abcd\nabc\nabcde\n' | gawk '/^.{4}$/'
abcd

लेकिन विफल रहता है, mawkजो POSIX के करीब है awkऔर AFAIK, उबंटू सिस्टम पर डिफ़ॉल्ट है:

$ printf 'abcd\nabc\nabcde\n' | mawk '/^.{4}$/'
$ ## prints nothing

तो, एक सरल समाधान के gawkबजाय उपयोग करना होगा awk{n}अंकन POSIX BRE (बुनियादी नियमित अभिव्यक्ति) वाक्य रचना का हिस्सा नहीं है। इसीलिए grepयहाँ भी विफल रहता है:

$ printf 'abcd\nabc\nabcde\n' | grep '^.{4}$'
$

हालाँकि, यह ERE का हिस्सा है (विस्तारित नियमित भाव):

$ printf 'abcd\nabc\nabcde\n' | grep -E '^.{4}$'
abcd

मुझे नहीं पता कि किस रेगीज़ फ्लेवर का उपयोग mawkPOSIX द्वारा किया जाता है awk, लेकिन मुझे लगता है कि यह BRE है। वे स्टीफन के जवाब के अनुसार ERE के पुराने संस्करण का उपयोग करते हैं । किसी भी मामले में, या तो आप जाहिरा तौर पर awkउस संस्करण का उपयोग कर रहे हैं जो ईआरई को लागू नहीं करता है या आपके इनपुट में वास्तव में बिल्कुल 4 वर्णों के साथ कोई रेखा नहीं है। यह व्हाट्सएप की वजह से हो सकता है जिसे आप नहीं देख सकते हैं या उदाहरण के लिए यूनिकोड ग्लिफ्स नहीं कर सकते हैं।


हाय टेर्डन, मैं उन लाइनों को प्रिंट करना चाहता हूं जो 4 वर्ण लंबी हैं। एक पंक्ति के पहले चार वर्ण नहीं। उदाहरण के लिए $ grep -E '^। {4} $' test_data, काम करेगा लेकिन वही awk के साथ काम नहीं कर रहा है
फॉरएवर लर्नर

@CppLearner हाँ, मैं यहाँ क्या कर रहा हूँ। क्या मतलब?
terdon

@CppLearner, @ टेर्डन का समाधान केवल उन पंक्तियों को प्रिंट करता है जो 4 वर्ण लंबे होते हैं। लेकिन अगर आप वास्तव में केवल लाइन की लंबाई में रुचि रखते हैं, तो आपको बस उसी का उपयोग करना चाहिए length($0)जो कि रेगेक्स की तुलना में अधिक कुशल हो।
स्टीफन किट

हाय टेराडॉन, स्टीलड्राइवर का समाधान वह है जिसकी मुझे तलाश थी। आपके समय के लिए धन्यवाद। हाय स्टीफन किट, जैसा कि मैंने समस्या में उल्लेख किया है, मैंने पहले से ही विकल्प के रूप में लंबाई का उपयोग किया है, मुझे यह जानने में अधिक दिलचस्पी थी कि पुनरावृत्ति regex {n} स्टीलड्राइवर की टिप्पणी से काम नहीं कर रहा है मुझे पता चला कि मुझे विकल्प का उपयोग करने की आवश्यकता है --re-interval या --posix। आपके समय के लिए धन्यवाद।
फॉरएवर लर्नर

1
mawkवास्तव में POSIX के करीब नहीं है awk, और BRE का उपयोग नहीं करता है। यह ERE का उपयोग करता है लेकिन {x,y}ऑपरेटर के बिना ।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.