গ্রেপ ব্যবহার করে কোনও চরিত্রের অবস্থান কীভাবে পাওয়া যায়?


11

গ্রেপ কমান্ড ব্যবহার করে স্ট্রিংয়ে একটি চরিত্রের পোস্টেশন সনাক্ত করতে হবে।

উদাহরণস্বরূপ, স্ট্রিং হয় RAMSITALSKHMAN|1223333

grep -n '[^a-zA-Z0-9\$\~\%\#\^]'

আমি |প্রদত্ত স্ট্রিংয়ের অবস্থানটি কীভাবে খুঁজে পাব?


এটা গ্রেপ সঙ্গে থাকতে হবে?
ব্রিয়াম

উত্তর:


29

আপনি -bবাইট অফসেট পেতে ব্যবহার করতে পারেন , যা সাধারণ পাঠ্যের অবস্থানের মতো (তবে ইউটিএফ -8 বা অনুরূপ নয়)।

$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|'
14:|

উপরের দিকে, আমি -aপাঠ্য হিসাবে ইনপুটটি ব্যবহার করতে গ্রেপকে বলতে সুইচটি ব্যবহার করি ; বাইনারি ফাইলগুলিতে অপারেটিং করার সময় প্রয়োজনীয় এবং -oকেবলমাত্র মিলে যাওয়া অক্ষর (গুলি) এ আউটপুট দিতে হবে।

আপনি যদি কেবল পজিশনটি চান তবে আপনি কেবল পজিশনটি বের করতে গ্রেপ ব্যবহার করতে পারেন:

$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' | grep -oE '[0-9]+'
14

আপনি যদি অদ্ভুত আউটপুট পান তবে গ্রেপের রঙ সক্ষম হয়েছে কিনা তা পরীক্ষা করে দেখুন। আপনি --colors=neverগ্রেপ এ গিয়ে রঙগুলি অক্ষম করতে পারেন বা একটি গ্রেপ কমান্ডের সাথে একটি উপকরণ \(যা কোনও কোনও উপকরণ অক্ষম করবে) উদাহরণস্বরূপ:

$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' --color=never | \grep -oE '^[0-9]+'
14

একাধিক ম্যাচ ফেরত দেয় এমন স্ট্রিংয়ের জন্য, head -n1প্রথম ম্যাচটি পেতে পাইপটি ।

নোট করুন যে আমি উপরের দুটিটিতে ব্যবহার করেছি এবং নোট করুন যে গ্রীক যদি একটি এক্সিকিউটেবল (স্ক্রিপ্ট বা অন্যথায়) এর মাধ্যমে "এলিয়াস" করা হয় তবে কেবলমাত্র এলিয়াস ব্যবহার করার সময় আর কাজ করবে না।


3
এখন অনুসন্ধান করুন 2;)
ইজকাটা

ধন্যবাদ @ ইজকাটা, আপনি ঠিক বলেছেন। আমি আমার পোস্টটি একটি সামান্য বিট আপডেট করেছি এবং অনুপস্থিত টুপি যুক্ত করেছি ^:)
রানেজুহল

1
আপনি গ্রেপের কোন সংস্করণ ব্যবহার করেছেন? আমি 0:|আউটপুট হিসাবে পাই - কারণ 0 লাইনটি |পাওয়া যায় সেখানে শুরুর বাইট অবস্থান ।
অ্যালেক্স

ডেবিয়ান প্রসারিত থেকে @Alex গনুহ, grep: grep (GNU grep) 2.27। আপনি সম্ভবত ওএস এক্স ব্যবহার করছেন?
রানুজুহল

11

চেষ্টা করুন:

printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'

আউটপুট:

15:|

এটি আপনাকে সূচক ভিত্তিক -১ সহ অবস্থান দেবে।


এটি কাজ করছে না :(
ব্যবহারকারী 82782

1
@ ব্যবহারকারী 82৮78৮২: আপনি কোন আদেশটি চালিয়েছেন? আপনি কিভাবে জানেন যে এটি কাজ করে না?
cuonglm

printf '%s\n' '|' | grep -o . | grep -n '|'প্রিন্ট 1, 0প্রত্যাশিত হিসাবে না ।
l0b0

1
@ l0b0: ওপি সূচী বেস 0 বা 1 চাইছে বলে দেয় না
কিউংলম

আমি কেবল একটি সফ্টওয়্যার বিকাশকারী কী আশা করবে বোঝাতে চাইছি।
l0b0

8

আপনি যদি শেল ব্যবহার করে থাকেন তবে আপনি বা মতো বাহ্যিক প্রক্রিয়াগুলির প্রয়োজন ছাড়াই বিশুদ্ধভাবে অন্তর্নির্মিত অপারেশনগুলি ব্যবহার করতে পারেন :

$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$ 

এটি কোনও পংক্তির অনুসরণের সমস্ত ঘটনাগুলি সরাতে এবং একটি অস্থায়ী পরিবর্তনশীলগুলিতে সংরক্ষণ করতে প্যারামিটার সম্প্রসারণ ব্যবহার করে |। এরপরে এটির সূচক পাওয়ার জন্য অস্থায়ী পরিবর্তনশীলটির দৈর্ঘ্য পরিমাপ করার বিষয় |

মূল স্ট্রিংটিতে আদৌ বিদ্যমান ifকিনা তা পরীক্ষা করে দেখুন Note |যদি এটি না হয় তবে অস্থায়ী পরিবর্তনশীল অরজিনালের মতোই হবে।

নোট এছাড়াও এটি শূন্য-ভিত্তিক সূচক সরবরাহ করে |যার মধ্যে সাধারণত ব্যাশ স্ট্রিংগুলি সূচীকরণের সময় কার্যকর হয়। তবে যদি আপনার ওয়ান-ভিত্তিক সূচকের প্রয়োজন হয় তবে আপনি এটি করতে পারেন:

$ echo $((${#tmp}+1))
15
$ 

1
সম্ভবত সর্বোত্তম উত্তর, এই বাক্য
গঠনটি

4

indexম্যাচটি ঘটে সেখানে অক্ষরের অবস্থান ফিরিয়ে দিতে আপনি awk এর ফাংশন ব্যবহার করতে পারেন :

echo "RAMSITALSKHMAN|1223333"|awk 'END{print index($0,"|")}'
15

পার্লের indexফাংশনটি ব্যবহার করতে যদি আপনার আপত্তি না থেকে থাকে তবে এটি শূন্য, একটি চরিত্রের এক বা একাধিক ঘটনার প্রতিবেদন পরিচালনা করে:

echo "|abc|xyz|123456|zzz|" | \
perl -nle '$pos=-1;while (($off=index($_,"|",$pos))>=0) {print $off;$pos=$off+1}'

পাঠযোগ্যতার জন্য, পাইপলাইনটি দুটি লাইনে বিভক্ত হয়েছে।

যতক্ষণ লক্ষ্য অক্ষর পাওয়া যায় ততক্ষণ indexশূন্য (0) এর ভিত্তিতে একটি ধনাত্মক মান প্রদান করে। সুতরাং, স্ট্রিং "abc | xyz | 123456 | zzz |" পার্স করা হলে 0, 4, 8, 15 এবং 19 অবস্থানে ফিরে আসে।


এই ব্যবহারের জন্য, গ্রেপ গ্রেগের চেয়ে আরও কার্যকর / সহজ।
আরচেমার 15

এটি কেবলমাত্র প্রথম স্থান মুদ্রণ মত স্ট্রিং সঙ্গে কাজ করবে নাRAMSITALSKHMAN|1|223333
cuonglm

3

আমরা "এক্সপ্রেস ম্যাচ" বা "এক্সপ্রেস সূচক" ব্যবহার করে এটিও করতে পারি

এক্সপ্রেস ম্যাচ $ স্ট্রিং $ স্ট্রিং যেখানে $ সাবস্ট্রিংটি আরই হয়।

echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`

এবং উপরেরটি আপনাকে অবস্থান দেবে কারণ এটি স্ট্রিংয়ের সাথে মিলে যাওয়া দৈর্ঘ্য প্রদান করে।

তবে অনুসন্ধানের সূচকের জন্য আরও সুনির্দিষ্ট হতে হবে:

mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`

অন্য কোথাও মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই। আমি @ জ্নুকের দেওয়া উত্তরটি ব্যক্তিগতভাবে পছন্দ করেছি। তবে কেন আমরা যখন 'এক্সপ্রেস' ব্যবহার করে সাধারণ জিনিস করতে পারি তখন কেন কেন বিশ্রী ব্যবহার এবং জটিল করে তুলতে হবে
ব্লুফগি

@kingsdeb এটি কেবল একটি পরামর্শ।
অবিনাশ রাজ

@িংসদেব: কারণ (১) awkফাইলের প্রতিটি লাইনে এই তথ্যের প্রতিবেদন করার জন্য সমাধানগুলি তুচ্ছভাবে সংশোধন করা যেতে পারে ( ENDজেআরফারগসনের উত্তর থেকে আপনার যা যা করতে হবে তা হ'ল , যা সত্যই কখনও প্রয়োজন ছিল না, এবং অবিনাশ রাজ ইতিমধ্যে তা করেছে) ; তবে, exprসমাধানটি করার জন্য আপনাকে একটি স্পষ্ট লুপ যুক্ত করতে হবে (এবং জ্নোকের উত্তরটি এগুলি করার জন্য সহজেই মানিয়ে নেওয়া যায় না, যা আমি দেখতে পাচ্ছি), এবং (২) awkসমাধানগুলি সমস্ত রিপোর্ট করার জন্য অভিযোজিত হতে পারে exprসমাধানের চেয়ে প্রতিটি লাইনে কিছুটা সহজেই মিলছে (আসলে, অবিনাশ রাজের ইতিমধ্যে এটিও রয়েছে)।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

আপনি echo `...`এখানে কেন ব্যবহার করবেন ?
স্টাফেন চেজেলাস

এটি কেবল এখানে আউটপুটটি দেখানোর জন্য
ব্লুফোগি

2

আরেকটি awk কমান্ড ,

$ echo 'RAMSITALSKHMAN|1223333'| awk 'BEGIN{ FS = "" }{for(i=1;i<=NF;i++){if($i=="|"){print i;}}}'
15

ফিল্ড বিভাজককে নাল স্ট্রিং হিসাবে সেট করে, awk রেকর্ডে স্বতন্ত্র চরিত্রটিকে পৃথক ক্ষেত্র হিসাবে রূপান্তরিত করে।


2

কিছু বিকল্পের মধ্যে রয়েছে:

জ্নুকের উত্তরের মতো, তবে শেলের সাথে:

echo 'RAMSITALSKHMAN|1223333' |
tr -c \| \\n | 
sh

sh: line 15: syntax error near unexpected token `|
sh: line 15: `|'

সঙ্গে sedএবং dcসম্ভবত একাধিক লাইন spanning:

echo 'RAMSITALSKHMAN|1223333' |
sed 's/[^|]/1+/g;s/|/p/;1i0 1+' |dc

15

সাথে $IFS...

IFS=\|; set -f; set -- ${0+RAMSITALSKHMAN|1223333}; echo $((${#1}+1))

এটি আপনাকে জানাবে যে এখানে কতগুলি রয়েছে ...

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