শেল স্ক্রিপ্টে একটি স্ট্রিংয়ের প্রদত্ত অবস্থানে চরটি কীভাবে পাবেন?


22

শেল স্ক্রিপ্টে একটি স্ট্রিংয়ের প্রদত্ত অবস্থানে চরটি কীভাবে পাবেন?

উত্তর:


36

"প্যারামিটার সম্প্রসারণ" এর সাথে ব্যাশে me me পরামিতি: অফসেট: দৈর্ঘ্য}

$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d

সম্পাদনা করুন: প্যারামিটার সম্প্রসারণ ছাড়াই (খুব মার্জিত নয়, তবে এটিই আমার কাছে প্রথম এসেছিল)

$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r

1
gnu.org/software/bash/manual/… এর আরও বিশদ রয়েছে
jsbillings


আপনি অফসেটটি 'শেষ থেকে' সেট করতে পারেন ঠিক echo ${var: -2:1}
তেমন

যে বাক্য গঠন ksh93 থেকে আসে এবং দ্বারা সমর্থিত zshএবং mksh
স্টাফেন চেজেলাস

6

প্যারামিটার বিস্তারের বিকল্প হ'ল expr substr

substr STRING POS LENGTH
    substring of STRING, POS counted from 1

উদাহরণ স্বরূপ:

$ expr substr hello 2 1
e

শীতল, আরও ভালভাবে এক্সপ্রেস পরীক্ষা করা উচিত ছিল।
ফোর্সফেস্ক

1
এটি জিএনইউ কোর্টিলস থেকে এক্সপ্রেসের সাথে কাজ করার ক্ষেত্রে প্রদর্শিত হয়, substrফ্রিবিএসডি, নেটবিএসডি বা ওএস এক্স থেকে এক্সপ্রেসের অন্তর্ভুক্ত নয় This এটি কোনও বহনযোগ্য সমাধান নয়।
ঘোটি

@ ঘোটি, দ্রষ্টব্য যে substrমূলত GNU এক্সটেনশান নয়। এর বাস্তব বাস্তবায়ন expr70 এর দশকের শেষদিকে পিডব্লিউবি ইউনিক্স থেকে এসেছিল এবং হয়েছে substr(তবে হয়নি :)।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, historicalতিহাসিক দৃষ্টিভঙ্গি যুক্ত করার জন্য ধন্যবাদ :) যদিও আমি নিশ্চিত যে পিডব্লিউবি এর ব্যবহার ওপি-র সাথে প্রাসঙ্গিক নয়, দশক ধরে বৈশিষ্ট্য এবং পরিবর্তনগুলি ট্র্যাক করা সর্বদা মজাদার। গনুহ অনেক মানুষ এর ডিফল্ট হতে থাকে, তবে সাধারণভাবে, আমি মনে করি আমি বিকল্প পরিষ্কারভাবে নয় ব্যবহার এড়িয়ে চাই POSIX , এবং প্রধান unices থেকে হারিয়েছে করা পরিচিত হয়।
ঘোটি

5

cut -c

যদি ভেরিয়েবলটিতে নিউলাইন থাকে না তবে আপনি এটি করতে পারেন:

myvar='abc'
printf '%s\n' "$myvar" | cut -c2

আউটপুট:

b

awk substr ভেরিয়েবলের নতুন লাইন থাকলেও এটি কার্যকর হয় এমন আরও একটি পসিক্স বিকল্প:

myvar="$(printf 'a\nb\n')" # note that the last newline is stripped by
                           # the command substitution
awk -- 'BEGIN {print substr (ARGV[1], 3, 1)}' "$myvar"

আউটপুট:

b

printf '%s\n'হ'ল পালানোর চরিত্রগুলির সমস্যাগুলি এড়ানো: /programming//a/40423558/895245 উদাহরণস্বরূপ:

myvar='\n'
printf '%s\n' "$myvar" | cut -c1

আউটপুট \হিসাবে প্রত্যাশিত।

আরও দেখুন: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scriptting

উবুন্টু 19.04 এ পরীক্ষিত।


printf '%s' "$myvar" | cut -c2পসিক্স নয় কারণ আউটপুট printfকোনও পাঠ্য নয় যেমন $myvarনতুন লাইনের অক্ষরে শেষ হয়। এটি অন্যথায় ধরে নেয় যে ভেরিয়েবলটিতে প্রতিটিcut ইনপুটটির প্রতিটি লাইন কেটে দেয় বলে নতুন লাইন অক্ষর থাকে না ।
স্টাফেন চেজেলাস

awkআরও একটি দক্ষ ও সঙ্গে নির্ভরযোগ্য হতে হবেawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
Stéphane Chazelas

নোট করুন যে GNU- র বর্তমান সংস্করণগুলির সাথে cut, এটি মাল্টি-বাইট অক্ষরগুলির জন্য কাজ করে না (মাক বা ব্যস্তবক্সের জন্য একই)
স্টাফেন চাজেলাস

পয়েন্টগুলির জন্য @ স্টাফেনচাজেলাস ধন্যবাদ জানায়। আপনি প্রথমটির অর্থটি কী বুঝলেন তা আমি বুঝতে পারি নি: আপনি কি বোঝাতে চেয়েছেন যে printf 'abc '| cut -c2এটি ভুল কারণ না \n(এটি সম্পর্কে আমি জানিনা), বা মাইভারের নতুন লাইনে থাকলে (কমান্ডটি ব্যর্থ হবে)?
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

1
cutইনপুটটি পাঠ্য না থাকলে এর আচরণ নির্ধারিত নয় (যদিও cutপ্রয়োগগুলি লাইনগুলি বা স্বেচ্ছাসেবী দৈর্ঘ্য হ্যান্ডেল করার জন্য প্রয়োজন)। এর আউটপুটটি পাঠ্যprintf abc নয় কারণ এটি একটি নতুন লাইনের অক্ষরে শেষ হয় না। বাস্তবায়নের উপর নির্ভর করে অনুশীলনে, আপনি যদি এটিটি পাইপ করেন তবে আপনি হয় , বা কিছুই পাবেন না । আপনার পসিক্স দ্বারা নির্দিষ্ট একটি আচরণ পেতে হবে (যা আউটপুট করা প্রয়োজন )cut -c2bb<newline>printf 'abc\n' | cut -c2b<newline>
স্টাফেন চেজেলাস

1

সঙ্গে zshবা yash, আপনি ব্যবহার করতে চাই:

$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*

(মধ্যে zsh, আপনি এটি সংক্ষিপ্ত করতে পারেন printf '%s\n' $text[3])।


0

আপনি কাট কমান্ড ব্যবহার করতে পারেন। তৃতীয় পোস্ট পেতে:

echo "SAMPLETEXT" | cut -c3

এই লিঙ্কটি দেখুন http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-exferences.html

( উন্নত ক্ষেত্রে ) তবে, আইএফএস পরিবর্তন করাও একটি ভাল জিনিস, বিশেষত যখন আপনার ইনপুটটিতে ফাঁকা স্থান থাকতে পারে। একা একা, নীচেরটি ব্যবহার করুন

saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs

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