जाग में फ़ील्ड विभाजक के रूप में रेगेक्स का उपयोग कैसे करें?


16

मैं क्षेत्र seperator के रूप में regex का उपयोग करने की कोशिश कर रहा हूँ awk। मेरे पढ़ने से यह संभव लगता है लेकिन मुझे वाक्यविन्यास सही नहीं मिल सकता है।

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

विचार? यदि लक्ष्य नहीं तो लक्ष्य बिना संस्करण संख्या के सॉफ़्टवेयर की सूची प्राप्त करना है।

जवाबों:


25

आपने अपने उद्धरण और वाक्य-विन्यास को मूक कर दिया है। इनपुट फ़ील्ड विभाजक सेट करने के लिए, इसे करने का सबसे आसान तरीका -Fकमांड लाइन पर विकल्प के साथ है :

awk -F '[0-9]' '{ print $1 }'

या

awk -F '[[:digit:]]' '{ print $1 }'

यह इनपुट क्षेत्र विभाजक के रूप में किसी भी अंक का उपयोग करेगा, और फिर प्रत्येक पंक्ति से पहला फ़ील्ड आउटपुट करेगा।

[0-9]और [[:digit:]]भाव नहीं हैं काफी अपने स्थान पर निर्भर करता है, एक ही। " [0-9], [[अंक:]] और \ d " के बीच अंतर देखें ।

एक भी सेट कर सकते हैं FSमें awkकार्यक्रम में ही। यह आमतौर पर एक BEGINब्लॉक में किया जाता है क्योंकि यह एक बार का आरम्भ होता है:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

ध्यान दें कि शेल में एकल-उद्धृत स्ट्रिंग में एकल उद्धरण का उपयोग नहीं किया जा सकता है, और यह awkतार हमेशा दोहरे उद्धरण का उपयोग करते हैं।


12

कुसलानंद के जवाब के लिए +1। वैकल्पिक रूप से, FS चर BEGIN ब्लॉक में सेट किया जा सकता है:

awk 'BEGIN {FS="[0-9]"} {print $1}'

अगली पंक्ति पढ़ने तक एक्शन ब्लॉक में एफएस को बदलना प्रभावी नहीं होगा

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

प्रश्न में अन्य त्रुटियां:

  • एकल-उद्धृत स्ट्रिंग के अंदर एकल उद्धरण का उपयोग नहीं कर सकते
  • ==एक तुलना ऑपरेटर है, =चर असाइनमेंट के लिए है

1
"अगली पंक्ति पढ़ने तक एक्शन ब्लॉक में एफएस को बदलना प्रभावी नहीं होगा" मैं उस जानकारी के लिए सब देख रहा हूं।
समीज़दिस

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