awk পুনরাবৃত্তি {n} কাজ করছে না


18

আমি পুনরাবৃত্তি প্রতীকটি ব্যবহার করে লাইনগুলি মুদ্রণের চেষ্টা করছি {n} তবে এটি কাজ করছে না। জন্য। যেমন আমি সমস্ত লাইন মুদ্রণ করতে চাই যার দৈর্ঘ্য 4 চর দীর্ঘ

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

উপরের কোডটি মুদ্রণ করছে না। কীভাবে এটি ঠিক করব যাতে আমি পুনরাবৃত্তি প্রতীকটি ব্যবহার করতে পারি? আমি বিকল্প হিসাবে জানি awk '/^....$/' test_dataএবংawk 'length ==3 ' test_data


3
আপনি কোন বিতরণ ব্যবহার করছেন? কোনটি?
টেরডন

1
k awk --version GNU Awk 3.1.7 $ cat / etc / redhat-released রেড হ্যাট এন্টারপ্রাইজ লিনাক্স সার্ভার রিলিজ 6.7 (সান্টিয়াগো)
চিরদিনের প্রশিক্ষক

2
আমি awk '/^.{4}+$/{print}' <<<$'foods\nbaarsz\nfooo' ঠিক চারটি অক্ষর মিলিয়ে বলতে চাই । আপনি নিজের উল্লেখ হিসাবে, awk 'length($0) == 4' test_dataপ্রায় সব awkসংস্করণ সঙ্গে সামঞ্জস্যপূর্ণ ।
ভ্যালেন্টাইন বাজরামি

4
কি awk --re-interval '/^.{4}$/' test_data বা awk --posix '/^.{4}$/' test_dataকাজ করে?
স্টিল্ড্রাইভার

ধন্যবাদ স্টিলিড্রাইভার এটি আমার সমস্যা সমাধান করেছে। সম্মত। আবারও ধন্যবাদ :)
চিরদিনের শিক্ষার্থী

উত্তর:


19

জিএনইউ আউক ব্যবহারকারীর গাইড: ফিচার হিস্টোর অনুসারে , নিয়মিত এক্সপ্রেশন রেঞ্জ অপারেটরদের জন্য সমর্থন ৩.০ সংস্করণে যুক্ত করা হয়েছিল তবে প্রাথমিকভাবে স্পষ্ট কমান্ড লাইন বিকল্পের প্রয়োজন

নতুন কমান্ড-লাইন বিকল্প:

  • নতুন কমান্ড-লাইন বিকল্প:
    • অজকের মূল সংস্করণ 7 ইউনিক্স সংস্করণে উপলব্ধ নয় এমন কনস্ট্রাক্ট সম্পর্কে সতর্ক করার জন্য --lint-old বিকল্পটি (ভি 7 / এসভিআর 3.1 দেখুন)।
    • বিডাব্লু কে থেকে উত্তম-মি বিকল্পটি k (ব্রায়ান তখনও বেল ল্যাবরেটরিতে ছিলেন)) পরে এটি তাঁর বাজানো এবং গাক থেকে উভয়কে সরিয়ে দেওয়া হয়েছিল।
    • Regexps এ অন্তরবৃত্তের এক্সপ্রেশন প্রদান করার জন্য --re-অন্তর বিকল্পটি (Regexp অপারেটরগুলি দেখুন)।
    • --Compat (অপশন দেখুন) এর আরও ভাল নাম হিসাবে --traditional বিকল্পটি যুক্ত করা হয়েছিল।

ইন gawk4.0,

বিরতি প্রকাশগুলি ডিফল্ট নিয়মিত প্রকাশের অংশে পরিণত হয়েছিল

আপনি যেহেতু gawk3.x ব্যবহার করছেন তাই আপনার ব্যবহারের প্রয়োজন হবে

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

অথবা

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

বা (ধন্যবাদ @ স্টাফেনচাজলাস) যদি আপনি এমন কোনও সমাধান চান যা বহনযোগ্য,

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

(যেহেতু --posixবা --re-intervalঅন্যান্য awkবাস্তবায়নে ত্রুটি ঘটবে )।


আপনার সময় এবং সহায়তার জন্য ধন্যবাদ স্টিল্ড্রাইভার। উত্সাহিত এবং একটি উত্তর হিসাবে গৃহীত
চিরদিনের

4
POSIXLY_CORRECT=anything awk '/^.{4}/'যেহেতু পোর্টেবল কোড তৈরি করে তা ব্যবহার করা আরও ভাল (একটি --posixবা --re-intervalঅন্যান্য awkপ্রয়োগের ক্ষেত্রে ত্রুটির কারণ ঘটবে )।
স্টাফেন চেজেলাস

হাই স্টাফেন চেজেলাস, আমি যখন কমান্ডটি জারি করেছি, $ পসিক্সএলওয়াই_কোরিট = যেকোন কিছুও '/^.{4}/' পরীক্ষা_ডাটা, এটি সমস্ত লাইন মুদ্রণ করেছিল। তখন আমি বুঝতে পেরেছি যে পুনরাবৃত্তি পরে কোন শেষ ডলার নেই। আপনার ইনপুট জন্য ধন্যবাদ। আপনার মন্তব্য এবং সমাধান সমর্থন। দুঃখিত, আমি পুনরাবৃত্তির পরে ission বাদ দেওয়ার কারণে এটি প্রথম স্থানে ভুল বুঝেছিলাম।
চিরদিনের শিক্ষার্থী

20

EREs ( প্রসারিত নিয়মিত এক্সপ্রেশনawk বা এর দ্বারা ব্যবহৃত হিসাবে egrep) প্রাথমিকভাবে ছিল না {x,y}। এটি প্রথমে বিআরইএসে প্রবর্তিত হয়েছিল (যেমন হিসাবে grepবা এটি দ্বারা ব্যবহৃত হয়েছিল sed), তবে এমন \{x,y\}বাক্য গঠন দিয়ে যা পিছনে বহনযোগ্যতা ভঙ্গ করে না।

কিন্তু যখন এটি {x,y}সিনট্যাক্সের সাথে ইআরআরগুলিতে যুক্ত করা হয়েছিল, তখন এটি পিছনে বহনযোগ্যতা ভেঙে দেয় কারণ একটি আরআর foo{2}আগে আলাদা কিছু মিলছিল ।

সুতরাং কিছু বাস্তবায়ন এটি না করা বেছে নিয়েছে। আপনি যে পাবেন /bin/awk, /bin/nawkএবং /bin/egrepসোলারিস এখনও এটা সম্মান না (আপনি ব্যবহার করতে হবে /usr/xpg4/bin/awkবা /usr/xpg4/bin/grep -E)। জন্য একই awkএবং nawkFreeBSD 'র উপর (উপর ভিত্তি করে ব্রায়ান Kernighan দ্বারা পরিচালিত ( মধ্যে ))।awkkawk

GNU- র জন্যawk , তুলনামূলকভাবে সাম্প্রতিককালে (সংস্করণ 4.0) অবধি POSIXLY_CORRECT=anything awk '/^.{4}$/'এটি সম্মানের জন্য আপনাকে এটি কল করতে হয়েছিল । mawkএখনও এটি সম্মান না

মনে রাখবেন যে অপারেটরটি কেবল সিনট্যাকটিক চিনি। উদাহরণস্বরূপ .{3,5}সর্বদা লেখা যেতে পারে ....?.?(যদিও অবশ্যই {3,5}অনেক বেশি সুগঠিত, এবং এর সমতুল্যটি আরও (foo.{5,9}bar){123,456}খারাপ হবে)।


ধন্যবাদ আবার স্টাফেন চেজেলাস। দুঃখিত, আমার খারাপ, আমি আপনার উত্তরটি প্রাথমিকভাবে বুঝতে পারিনি। অনেক ধন্যবাদ এবং upvated।
চিরকালীন শিক্ষার্থী

6

এটি জিএনইউ awk(গোক) এর সাথে প্রত্যাশার মতো কাজ করে :

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

তবে ব্যর্থতা mawkযা পসিক্সের কাছাকাছি awkএবং উবুন্টু সিস্টেমে এটিএফইএইকে ডিফল্ট:

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

সুতরাং, একটি সহজ সমাধান gawkপরিবর্তে ব্যবহার করা হবে awk{n}স্বরলিপি POSIX BRE (মৌলিক রেগুলার এক্সপ্রেশন) বাক্য গঠন অংশ নয়। এজন্য grepএখানেও ব্যর্থ হয়:

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

তবে এটি পূর্বের অংশ (বর্ধিত নিয়মিত অভিব্যক্তি):

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

আমি জানি না কোন রেজেক্স গন্ধটি পসিক্স mawkবা পসিক্স ব্যবহার করেছেন awkতবে আমি অনুমান করব যে এটি বিআরই। তারা স্টাফেনের উত্তর অনুসারে ERE এর একটি পুরানো সংস্করণ ব্যবহার করে । যাইহোক, হয় আপনি স্পষ্টতই এর একটি সংস্করণ ব্যবহার করছেন awkযা পূর্বে বাস্তবায়ন করে না বা আপনার ইনপুটটিতে আসলে 4 টি অক্ষরের কোনও রেখা নেই। এটি হোয়াইটস্পেসের কারণে ঘটতে পারে যা আপনি দেখতে পাচ্ছেন না বা ইউনিকোড গ্লাইফগুলি উদাহরণস্বরূপ।


হাই টার্ডন, আমি 4 টি অক্ষরের দীর্ঘ লাইনগুলি মুদ্রণ করতে চাই। কোনও লাইনের প্রথম চারটি অক্ষর নয়। '। ^ {4} $' উদাহরণ $, grep -E জন্য test_data, কাজ করবে কিন্তু একই awk সঙ্গে কাজ করছে না
সব সময় প্রবেশ করুন শিক্ষার্থী

@ সিপিপি্লায়ারনার হ্যাঁ, আমি এখানে যা করছি। আপনি কি বোঝাতে চেয়েছেন?
টেরডন

@ সিপিপিআল্নার, @ টেরডনের সমাধানটি কেবলমাত্র 4 টি অক্ষরের দীর্ঘ লাইনগুলি মুদ্রণ করে। তবে আপনি যদি কেবল লাইনের দৈর্ঘ্যে আগ্রহী হন তবে আপনার কেবলমাত্র ব্যবহার করা উচিত length($0)যা রেজেক্সগুলির চেয়ে বেশি দক্ষ।
স্টিফেন কিট

হাই টেরডন, স্টিল্ড্রাইভারের সমাধানটি আমি যা খুঁজছিলাম। আপনার সময় জন্য ধন্যবাদ। হাই স্টিফেন কিট, যেমন আমি সমস্যার মধ্যে উল্লেখ করেছি, আমি ইতিমধ্যে বিকল্প হিসাবে দৈর্ঘ্যটি ব্যবহার করেছি, পুনরাবৃত্তি রেজেক্স ste n ste স্টিল্ড্রাইভারের মন্তব্য থেকে কেন কাজ করছে না তা জানতে আমি আরও আগ্রহী হয়েছি আমি জানতে পেরেছিলাম যে আমাকে বিকল্পটি ব্যবহার করতে হবে --re-interval বা --posix। আপনার সময় জন্য ধন্যবাদ।
চিরকালীন শিক্ষার্থী

1
mawkawkপসিক্সের খুব কাছাকাছি নয় , এবং বিআরই ব্যবহার করে না। এটি EREs ব্যবহার করে তবে {x,y}অপারেটর ছাড়াই ।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.