বাশে একটি স্ট্রিং সূচক


15

আমি কীভাবে sh / bash এ সূচক দ্বারা একটি স্ট্রিং উল্লেখ করতে পারি? এটি হ'ল মূলত এটি বিভক্ত করা।

আমি একটি ফাইলের নামের পাঁচটি অক্ষর ফেলার চেষ্টা করছি। সমস্ত নামের কাঠামো রয়েছে: নাম_আর_কোড। আমি 5 টি বর্ণানুক্রমিক কোড বিট অপসারণ করার চেষ্টা করছি। name_nr_সর্বদা 10 টি অক্ষর।

কিছু আছে কি মত;

for i in * ; do mv "$i" "$i"[:10] ; done


5
bashআপনি যদি shসমাধান চাইছেন তবে ট্যাগটি কেন ?
— স্টাফেন চেজেলাস

উত্তর:


15

এই হিসাবে সহজ।

(ব্যাশ)

for i in * ; do mv -- "$i" "${i:0:5}" ; done

Voila।

এবং অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড ( অধ্যায় 10. ভেরিয়েবলগুলি ম্যানিপুলেটিং ) এর একটি ব্যাখ্যা , ( NOTEসেই ম্যানুয়ালটিতে ত্রুটিগুলি হাইলাইট করার জন্য অতিরিক্ত এস ইনলাইন সহ ):

সাবস্ট্রিং এক্সট্রাকশন

${string:position}

$stringএ থেকে সাবস্ট্রিং উত্তোলন করে $position।

যদি $stringপ্যারামিটারটি "*" বা "@" হয় তবে এটি শুরু করে অবস্থানগত পরামিতিগুলি বের করে $position।

${string:position:length}

চায়ের $lengthথেকে সাবস্ট্রিং অক্ষর $stringএ $position।

NOTEপ্যারামিটার সম্প্রসারণ কাছাকাছি উদ্ধৃতি! echoযথেচ্ছ ডেটা ব্যবহার করা উচিত নয়।

stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.

echo ${stringZ:0}                       # abcABC123ABCabc
echo ${stringZ:1}                       # bcABC123ABCabc
echo ${stringZ:7}                       # 23ABCabc 

echo ${stringZ:7:3}                     # 23A
                                        # Three characters of substring.


# Is it possible to index from the right end of the string?

echo ${stringZ:-4}                      # abcABC123ABCabc
# Defaults to full string, as in ${parameter:-default}.
# However . . . 

echo ${stringZ:(-4)}                    # Cabc
echo ${stringZ: -4}                     # Cabc
# Now, it works.
# Parentheses or added space "escape" the position parameter.

অবস্থান এবং দৈর্ঘ্য আর্গুমেন্ট "স্থিতিমাপ," যেতে পারে যে, প্রতিনিধিত্ব একটি পরিবর্তনশীল হিসাবে, বরং একটি সংখ্যাসূচক ধ্রুবক যেমন হয়।


যদি $stringপ্যারামিটারটি "*" বা "@" হয় তবে এটি $lengthশুরু করে সর্বাধিক অবস্থানিক পরামিতিগুলি বের করে $position।

echo ${*:2}          # Echoes second and following positional parameters.
echo ${@:2}          # Same as above.

echo ${*:2:3}        # Echoes three positional parameters, starting at second.

NOTE: expr substrএকটি জিএনইউ এক্সটেনশন।

expr substr $string $position $length

শুরু $lengthথেকে অক্ষর আহরণ $stringকরে $position।

stringZ=abcABC123ABCabc
#       123456789......
#       1-based indexing.

echo `expr substr $stringZ 1 2`           # ab
echo `expr substr $stringZ 4 3`           # ABC

NOTE: echoএটি অনর্থক এবং এটি আরও কম নির্ভরযোগ্য করে তোলে। ব্যবহার expr substr + "$string1" 1 2।

NOTE: exprআউটপুট 0 (বা -0, 00 ...) হলে একটি শূন্য-বহির্গমন স্থিতি নিয়ে ফিরে আসবে।


BTW। বইটি সরকারী উবুন্টু সংগ্রহস্থলে উপস্থিত রয়েছে abs-guide।


"অবস্থান" বলতে আসলে এটি একটি অফসেট হিসাবে সামান্য বিভ্রান্তিকর, যার অর্থ "প্রথম অবস্থান" থেকে ${var:1}মানটি ফিরে আসে না var, তবে আসলে ২ য় স্থান থেকে।
— কুসালানন্দ

এটি সত্য, তবে আপনি যতক্ষণ না সম্মত হন ততক্ষণ সেখানে শূন্য-তম অবস্থান থাকতে পারে। আমার সাথে যা ঠিক আছে।

9

পসিক্সে sh,

  • "${var%?????}"হয় $varগত 5 চিহ্ন অক্ষর ছিনতাই (অথবা $varযদি $varকম 5 অক্ষরের রয়েছে)

  • "${var%"${var#??????????}"}"এর প্রথম 10 টি অক্ষর $var।

  • "${var%_*}"হয় $varসবচেয়ে কম স্ট্রিংটি ম্যাচ কেড়ে _*শেষে $var( foo_bar_baz-> foo_bar)।
  • "${var%%_*}": সংক্ষিপ্ততম ম্যাচের পরিবর্তে একই তবে দীর্ঘতম ম্যাচ ( foo_bar_baz-> foo)।
  • যদি আপনি পেতে চেয়েছিলেন foo_bar_: "${var%"${var##*_}"}"( শেষের পরিবর্তে শুরুতে প্যাটার্নটি সন্ধান ${var##pattern}করার অনুরূপ )।${var%%pattern}$var

সহ zsh:

  • $var[1,-6] প্রথম চরিত্রের জন্য শেষ থেকে 6th ষ্ঠ পর্যন্ত (তাই শেষ 5 টি ব্যতীত)।
  • $var[1,10] প্রথম 10 টি অক্ষরের জন্য।

সাথে ksh, bashবা zsh:

  • "${var:0:10}": প্রথম 10 অক্ষর $var

সাথে bashবা zsh:

  • "${var:0:-5}": সবশেষে শেষ 5 টি অক্ষর (একটি ত্রুটি দেয় এবং $varসেট করা থাকলে স্ক্রিপ্টটি প্রস্থান করে তবে 5 টিরও কম অক্ষর থাকে, যখন $varসেট না করা থাকে zsh)।

আপনার যদি বোর্নের shসামঞ্জস্যতা প্রয়োজন , নির্ভরযোগ্যভাবে করা খুব কঠিন। আপনি যদি গ্যারান্টি দিতে পারেন তবে ফলাফলটি নতুন লাইনের অক্ষরে শেষ হবে না আপনি যা করতে পারেন:

first_10=`expr " $var" : ' \(.{1,10\}\)'` # beware the exit status
                                          # may be non-zero if the
                                          # result is 0 or 0000000000

all_but_last_5=`expr " $var" : ' \(.*\).\{5\}'`

আপনার দৈর্ঘ্যের $var(সিস্টেমের মধ্যে পৃথক) সীমাও থাকবে ।

এই সমস্ত সমাধানগুলিতে, যদি $varএমন বাইট থাকে যা বৈধ অক্ষরের অংশ তৈরি করতে পারে না, ওয়াইএমএমভি।


আমার, তারা সত্যিই সেই ধনুর্বন্ধনীগুলির ভিতরে কিছু কুৎসিত বাক্য গঠন নিয়ে আসে।
— বিড়াল

2

shস্ট্রিংয়ের বাইরে একটি স্ট্রিংয়ের বাইরে যাওয়ার কোনও অন্তর্নির্মিত উপায় সরবরাহ করে না (যতদূর আমি দেখতে পাচ্ছি), তবে আপনার সাথে এটি bashকরতে পারে

${i:0:10}

এটি আপনাকে ভেরিয়েবলের মানটির প্রথম দশটি অক্ষর দেবে i।

সাধারণ বিন্যাসটি হ'ল ${variable:offset:length}।


2

বেশিরভাগ শেলগুলি কোনও ধরণের প্যারামিটার সম্প্রসারণকে সমর্থন করে যা আপনাকে সহায়তা করতে পারে। ব্যাশে, আপনি ব্যবহার করতে পারেন

substr=${string:4:5} # start at position 4, length 5.

ইন dash, অফসেটগুলি সমর্থিত নয়, তবে আপনি নেতৃস্থানীয় এবং পিছনের ধরণগুলি ব্যবহার করতে পারেন:

remove_first3=${string#???}
remove_last2=${string%??}

0

প্রথমে forফাইলের নামের জন্য একটি লুপ ব্যবহার করবেন না ।

তারপরে, এর মতো কিছুতে সহায়তা করা উচিত।

find ./ -type f | while read filename ;do
  newfilename=$(echo ${filename}|cut -c 1-10)
  mv ${filename} ${newfilename}
done

3
forফাইলের নাম ব্যবহার করা খারাপ কেন ?
— চোরোবা

আপনার ভেরিয়েবলগুলি উদ্ধৃত করুন এবং printfনিরাপদ হতে ব্যবহার করুন । ... এবং read -r।
— কুসালানন্দ

3
ওপির forলুপটি নিখোঁজ বাদে ঠিক ছিল --। আমি আপনার 4 লাইনের কোডটিতে কমপক্ষে 10 টি বাগ দেখতে পাচ্ছি! যার মধ্যে বেশিরভাগ সুপরিচিত খারাপ অনুশীলন যেমন ফাইলের নামগুলি একক লাইন ধরে নেওয়া হয়, প্রতিধ্বনি ব্যবহার করে, অনুপস্থিত উদ্ধৃতিগুলি ব্যবহার করে
— স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.