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


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.