উত্তর:
আপনি -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
প্রথম ম্যাচটি পেতে পাইপটি ।
নোট করুন যে আমি উপরের দুটিটিতে ব্যবহার করেছি এবং নোট করুন যে গ্রীক যদি একটি এক্সিকিউটেবল (স্ক্রিপ্ট বা অন্যথায়) এর মাধ্যমে "এলিয়াস" করা হয় তবে কেবলমাত্র এলিয়াস ব্যবহার করার সময় আর কাজ করবে না।
2
;)
^
:)
0:|
আউটপুট হিসাবে পাই - কারণ 0 লাইনটি |
পাওয়া যায় সেখানে শুরুর বাইট অবস্থান ।
grep (GNU grep) 2.27
। আপনি সম্ভবত ওএস এক্স ব্যবহার করছেন?
চেষ্টা করুন:
printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'
আউটপুট:
15:|
এটি আপনাকে সূচক ভিত্তিক -১ সহ অবস্থান দেবে।
printf '%s\n' '|' | grep -o . | grep -n '|'
প্রিন্ট 1
, 0
প্রত্যাশিত হিসাবে না ।
আপনি যদি ব্যাশ শেল ব্যবহার করে থাকেন তবে আপনি গ্রিপ বা অ্যাডকের মতো বাহ্যিক প্রক্রিয়াগুলির প্রয়োজন ছাড়াই বিশুদ্ধভাবে অন্তর্নির্মিত অপারেশনগুলি ব্যবহার করতে পারেন :
$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$
এটি কোনও পংক্তির অনুসরণের সমস্ত ঘটনাগুলি সরাতে এবং একটি অস্থায়ী পরিবর্তনশীলগুলিতে সংরক্ষণ করতে প্যারামিটার সম্প্রসারণ ব্যবহার করে |
। এরপরে এটির সূচক পাওয়ার জন্য অস্থায়ী পরিবর্তনশীলটির দৈর্ঘ্য পরিমাপ করার বিষয় |
।
মূল স্ট্রিংটিতে আদৌ বিদ্যমান if
কিনা তা পরীক্ষা করে দেখুন Note |
যদি এটি না হয় তবে অস্থায়ী পরিবর্তনশীল অরজিনালের মতোই হবে।
নোট এছাড়াও এটি শূন্য-ভিত্তিক সূচক সরবরাহ করে |
যার মধ্যে সাধারণত ব্যাশ স্ট্রিংগুলি সূচীকরণের সময় কার্যকর হয়। তবে যদি আপনার ওয়ান-ভিত্তিক সূচকের প্রয়োজন হয় তবে আপনি এটি করতে পারেন:
$ echo $((${#tmp}+1))
15
$
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 অবস্থানে ফিরে আসে।
RAMSITALSKHMAN|1|223333
আমরা "এক্সপ্রেস ম্যাচ" বা "এক্সপ্রেস সূচক" ব্যবহার করে এটিও করতে পারি
এক্সপ্রেস ম্যাচ $ স্ট্রিং $ স্ট্রিং যেখানে $ সাবস্ট্রিংটি আরই হয়।
echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`
এবং উপরেরটি আপনাকে অবস্থান দেবে কারণ এটি স্ট্রিংয়ের সাথে মিলে যাওয়া দৈর্ঘ্য প্রদান করে।
তবে অনুসন্ধানের সূচকের জন্য আরও সুনির্দিষ্ট হতে হবে:
mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`
awk
ফাইলের প্রতিটি লাইনে এই তথ্যের প্রতিবেদন করার জন্য সমাধানগুলি তুচ্ছভাবে সংশোধন করা যেতে পারে ( END
জেআরফারগসনের উত্তর থেকে আপনার যা যা করতে হবে তা হ'ল , যা সত্যই কখনও প্রয়োজন ছিল না, এবং অবিনাশ রাজ ইতিমধ্যে তা করেছে) ; তবে, expr
সমাধানটি করার জন্য আপনাকে একটি স্পষ্ট লুপ যুক্ত করতে হবে (এবং জ্নোকের উত্তরটি এগুলি করার জন্য সহজেই মানিয়ে নেওয়া যায় না, যা আমি দেখতে পাচ্ছি), এবং (২) awk
সমাধানগুলি সমস্ত রিপোর্ট করার জন্য অভিযোজিত হতে পারে expr
সমাধানের চেয়ে প্রতিটি লাইনে কিছুটা সহজেই মিলছে (আসলে, অবিনাশ রাজের ইতিমধ্যে এটিও রয়েছে)।
echo `...`
এখানে কেন ব্যবহার করবেন ?
$ echo 'RAMSITALSKHMAN|1223333'| awk 'BEGIN{ FS = "" }{for(i=1;i<=NF;i++){if($i=="|"){print i;}}}'
15
ফিল্ড বিভাজককে নাল স্ট্রিং হিসাবে সেট করে, awk রেকর্ডে স্বতন্ত্র চরিত্রটিকে পৃথক ক্ষেত্র হিসাবে রূপান্তরিত করে।
কিছু বিকল্পের মধ্যে রয়েছে:
জ্নুকের উত্তরের মতো, তবে শেলের সাথে:
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))