প্রদত্ত বিতরণকারীদের মধ্যে কীভাবে এন-থ্রি স্ট্রিংকে গ্রেপ করবেন?


3

ধরা যাক আমাদের একটি স্ট্রিং রয়েছে এবং এর সীমানাটি হ'ল ?:

Leslie Cheung April 1 ? Elvis August 16 ? Leonard Nimoy February 27

আমি জানি কীভাবে grepডিলিমিটারগুলির মধ্যে প্রথম সাবস্ট্রিং করতে হয়:

echo $above_string | grep -oP "^[^?]*"
Leslie Cheung April 1

দ্বিতীয় বা তৃতীয় স্ট্রাস্টিং গ্রেপ করার জন্য আমি কীভাবে রেজেক্স পরিবর্তন করব?


3
আমি এর cutপরিবর্তে ব্যবহার করব grep:echo ... | cut '-d?' -f2
পিএমজি

উত্তর:


4
echo $above_string | grep -oP "^([^?]*\?){2}\K[^?]*"

পরিবর্তন 2করার জন্য n - 1অর্ডার n তম স্ট্রিং প্রাপ্ত মান।

এটি ধরে নিয়েছে যে আপনি সেই লাইনে নবম স্ট্রিং চান । আপনার কাছে এন - 1 টি স্ট্রিং রয়েছে যার ?সাথে কোনও আক্ষরিক শেষ নেই ? ' ( \?যেহেতু এটি পার্ল রেজেেক্সে একটি বিশেষ চরিত্র)। তারপরে আপনার সাথে \Kবলা হয়েছে যে আপনি পূর্ববর্তী বিষয়বস্তুগুলিতে আগ্রহী নন, এভাবে পরবর্তী বিভাজক পর্যন্ত কেবল নীচের পাঠ্যটি উত্তোলন করা উচিত।


ধন্যবাদ, খুব ভাল, আমি \ কে-এর পরে অংশটি বুঝতে পারি না, ভাল আপনি এটি ব্যাখ্যা করেছেন?
আবদুল আল হাজরেড

1
[^?]*একই Regex আপনি প্রশ্ন ব্যবহার করা হয়: কিছু একটি ধারণকারী না? (বিভাজক) লোভী উপায়ে (এভাবে ?রেখার শেষ বা শেষ সন্ধান পাওয়া পর্যন্ত চলছে )
অ্যাঞ্জেল

সুতরাং, ^ ([[^?] * \?) {2 প্রথম দুটি সাবস্ট্রিংগুলিকে স্বীকৃতি দেয় যা একটিতে শেষ হয়? , \ k তাদের মেরে ফেলে এবং তৃতীয় ঘটনাটি শেষ পর্যন্ত গ্রেপ হয়?
আবদুল আল হ্যাজেড

10

কিভাবে কাটা ব্যবহার সম্পর্কে? আপনি যদি দ্বিতীয় প্যাটার্ন মুদ্রণ করতে চান

echo "$above_string" | cut -f2 -d "?"

দ্বিতীয় কলাম পরে

echo "$above_string" | cut -f2- -d "?"


4

নিউ লাইন দ্বারা পৃথক দ্বিতীয় এবং তৃতীয় রেকর্ডগুলি মুদ্রণ করতে Awk ব্যবহার করে:

awk -F"?" '{printf "%s\n%s\n", $2,$3}'
Elvis August 16 
Leonard Nimoy February 27

আপনি যদি রেকর্ডটি সরিয়ে নিতে চান তবে আপনি এটিকে ভেরিয়েবল হিসাবে সেট করতে পারেন:

awk -v record=2 -F"?" '{print $record}'
Elvis August 16 

3

আপনি যা sedকরতে পারেন তা সহ:

sed '/\n/P;//d;s/[^?]*/\n&\n/[num];D'

... যেখানে আপনি উপরেরটিকে [num]কিছু সংখ্যক পছন্দসই সংঘটিত প্রতিনিধিত্ব করে প্রতিস্থাপন করবেন ।

আপনি উল্লিখিত উদাহরণ হিসাবে প্রদর্শিত হিসাবে চিহ্নিত নির্দিষ্ট সংঘটন উপস্থিত না থাকলে, sedকেবল কিছুই মুদ্রণ করবে।

echo ,2,3 | sed '/\n/P;//d;s/[^,]*/\n&\n/4;D'

প্রথম ম্যাচের উপরে শূন্য বা আরও বেশি না-কমা অক্ষরের অনুক্রমের জন্য প্রথম কমাটির আগে ঘটে যাওয়া শূন্য অক্ষর। দ্বিতীয়টি 2এবং তৃতীয়টি হ'ল 3- সেই ধরণের কোনও চতুর্থ ঘটনা নেই এবং তাই প্রতিস্থাপনটি সফল হয় না।

এও নোট করুন যে প্রত্যেকে ডান-হাতের প্রতিস্থাপন ক্ষেত্রের ক্ষেত্রে নিউলাইন পলায়নকে sedসমর্থন করবে না \nএবং আপনাকে nপালানোর স্ট্রিংয়ের অক্ষরগুলিকে আক্ষরিক নতুন লাইনের সাথে প্রতিস্থাপন করতে হতে পারে ।

sed '/\n/P;//d;s/[^?]*/\
&\
/[num];D'

আপনার স্ট্রিং দিয়ে এটি করে:

str='> Leslie Cheung April 1 ? Elvis August 16 ? Leonard Nimoy February 27'
for o in 1 2 3
do  printf %s\\n "$str" |
    sed "/\n/P;//d;s/[^?]*/\n:$o:&\n/$o;D"
done

... যা সামান্য forলুপ যা sed3 [^?]*টি ম্যাচ এবং প্রিন্টের চেষ্টা করে 3 বার চালায় ...

:1:> Leslie Cheung April 1
:2: Elvis August 16
:3: Leonard Nimoy February 27

... বা প্রতিটি মানের জন্য একটি $o

[num]নাল-নালাগুলির মতো ঘটনাগুলি এড়াতে আপনি এটিকে সামান্য প্রসারিত করতে পারেন:

i= 
until [ "$((i+=1))" -gt 10 ] &&
      printf %s\\n "$str"
do    printf %s ":$i:$str?"; done |
sed '/..*\n?*/P;s///;s/[^?]*/\n&\n/7;D'

... যা ছাপায় ...

:3:> Leslie Cheung April 1
 Elvis August 16
 Leonard Nimoy February 27
:10:> Leslie Cheung April 1

এটিও অন্তর্ভুক্ত হতে পারে । উদাহরণ স্বরূপ:

printf %s\\n "$str?$str" |
sed '/.*\n[^_[:alnum:]]*/P;s///
    s/[_[:alnum:]]\{1,\}/\n&\n/3;D'

... যা প্রত্যেকটি পৃথক রেখায় প্রতিটি তৃতীয় _বর্ণমালার এবং নখের ক্রম অনুসারে আপনার দুটি স্ট্রিংয়ের মিশ্রণে মুদ্রণ করে ...

April
August
Nimoy
Leslie
1
16
February

2

কিন্তু

আপনি এটির জন্য সেড ব্যবহার করতে পারেন, তবে এটি যুক্তিযুক্ত নয়, উদাহরণস্বরূপ এখানে একটি শূন্য-ভিত্তিক সমাধান যা পছন্দসই ক্ষেত্রটি নির্বাচন করতে কোয়ান্টিফায়ার ব্যবহার করে:

n=1
sed 's/\([^?]*? *\)\{'$n'\}//; s/?.*//' <<<"$above_string"

আউটপুট:

Elvis August 16 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.