কীভাবে বেতারে ক্ষেত্র বিভাজক হিসাবে রেজেক্স ব্যবহার করবেন?


16

আমি ফিল্ড সেপারেটর হিসাবে রেগেক্স ব্যবহার করার চেষ্টা করছি 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 ভেরিয়েবলটি বিগইন ব্লকে সেট করা যেতে পারে:

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

পরবর্তী লাইনটি না পড়া পর্যন্ত অ্যাকশন ব্লকে এফএস পরিবর্তন কার্যকর হবে না

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

প্রশ্নের অন্যান্য ত্রুটি:

  • একটি একক-উদ্ধৃত স্ট্রিংয়ের মধ্যে একক উদ্ধৃতি ব্যবহার করতে পারে না
  • ==একটি তুলনামূলক অপারেটর, =পরিবর্তনশীল অ্যাসাইনমেন্টের জন্য

1
"পরবর্তী লাইনটি পড়া না হওয়া অবধি" অ্যাকশন ব্লকে এফএস পরিবর্তন কার্যকর হবে না "আমি এই তথ্যের জন্য সন্ধান করছি।
সামিজদিস

1
প্লাস: স্ট্রিং মানটির জন্য একক কোট ব্যবহার করতে পারবেন না, এমনকি আপনি শেল থেকে সঠিকভাবে পাস
করলেও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.