আমি একটি স্ট্রিংয়ের শেষ চরিত্রটি মুছতে চাই, আমি এই ছোট স্ক্রিপ্টটি চেষ্টা করেছি:
#! /bin/sh
t="lkj"
t=${t:-2}
echo $t
তবে এটি "এলকেজে" মুদ্রণ করে, আমি কী ভুল করছি?
আমি একটি স্ট্রিংয়ের শেষ চরিত্রটি মুছতে চাই, আমি এই ছোট স্ক্রিপ্টটি চেষ্টা করেছি:
#! /bin/sh
t="lkj"
t=${t:-2}
echo $t
তবে এটি "এলকেজে" মুদ্রণ করে, আমি কী ভুল করছি?
উত্তর:
পসিক্স শেলের মধ্যে সিনট্যাক্সের ${t:-2}
অর্থ অন্যরকম কিছু হয় - এটি সেট এবং অ শূন্য t
থাকলে মানটির মধ্যে প্রসারিত হয় t
এবং অন্যথায় মানটিতে 2
। প্যারামিটার সম্প্রসারণ দ্বারা একটি অক্ষর ছাঁটাতে, আপনি সম্ভবত চান সিনট্যাক্সটি${t%?}
মনে রাখবেন যে, মধ্যে ksh93
, bash
বা zsh
, ${t:(-2)}
বা ${t: -2}
(স্থান মনে রাখবেন) হয় একটি সাবস্ট্রিং সম্প্রসারণ যেমন আইনি কিন্তু সম্ভবত না কি আপনি চান, যেহেতু তারা সাবস্ট্রিং শেষ থেকে একটি অবস্থান থেকে শুরু 2 অক্ষর (আসতে অর্থাত সরিয়ে ফেলা হবে প্রথম অক্ষর i
এর স্ট্রিং ijk
)।
আরও তথ্যের জন্য বাশ রেফারেন্স ম্যানুয়ালটির শেল প্যারামিটার সম্প্রসারণ বিভাগটি দেখুন:
${parameter%word}
সংক্ষিপ্ত প্রত্যয় প্যাটার্ন মেলানো সরিয়ে দেয়word
man bash
সঙ্গে bash
4.2 এবং উপরোক্ত, আপনি করতে পারেন:
${var::-1}
উদাহরণ:
$ a=123
$ echo "${a::-1}"
12
লক্ষ্য করুন যে পুরানোদের জন্য bash
(উদাহরণস্বরূপ, bash 3.2.5
ওএস এক্সে) আপনার কোলনের মধ্যে এবং পরে ফাঁকা জায়গা ছেড়ে দেওয়া উচিত:
${var: : -1}
bash
4..২-আলফা এবং এর উপরের সংস্করণে কাজ করে, আমার যে সংস্করণটিতে অ্যাক্সেস রয়েছে তা খুব খারাপ। : - /
${var:offset:lenght}
কেবলমাত্র যুক্ত করা হয়েছিল bash 4.2
। হতে পারে ওএসএক্স এর জন্য নিজস্ব প্যাচ যুক্ত করে bash
।
n
লাইন থেকে শেষ অক্ষরগুলি অপসারণের জন্য যা sed
OR ব্যবহার করে না awk
:
> echo lkj | rev | cut -c (n+1)- | rev
সুতরাং উদাহরণস্বরূপ আপনি এটি one character
ব্যবহার করে শেষ চরিত্রটি মুছতে পারেন :
> echo lkj | rev | cut -c 2- | rev
> lk
rev
ম্যানপেজ থেকে :
বর্ণনা
রেভ ইউটিলিটি প্রতিটি লাইনের অক্ষরের ক্রমকে বিপরীত করে নির্দিষ্ট ফাইলগুলিকে স্ট্যান্ডার্ড আউটপুটে অনুলিপি করে। যদি কোনও ফাইল নির্দিষ্ট করা না হয় তবে স্ট্যান্ডার্ড ইনপুটটি পড়া হয়।
হালনাগাদ:
আপনি যদি স্ট্রিংয়ের দৈর্ঘ্য জানেন না, তবে চেষ্টা করুন:
$ x="lkj"
$ echo "${x%?}"
lk
সেড ব্যবহার করা যতটা দ্রুত হওয়া উচিত
sed 's/.$//'
আপনার একক প্রতিধ্বনি তখন echo ljk | sed 's/.$//'
।
এটি ব্যবহার করে, 1-লাইনের স্ট্রিংটি যে কোনও আকারের হতে পারে।
শেলের উপর নির্ভর করে কয়েকটি বিকল্প:
t=${t%?}
t=`expr " $t" : ' \(.*\).'`
t=${t[1,-2]}
t=${t:0:-1}
t=${t:0:${#t}-1}
t=${t/%?}
t=${t/~(E).$/}
@ {t=$1} ~~ $t *?
মনে রাখবেন যে সকলের শেষ চরিত্রটি ছাঁটাই করার কথা থাকলেও আপনি দেখতে পাবেন যে কিছু বাস্তবায়ন (যারা মাল্টি-বাইট অক্ষরকে সমর্থন করে না) তার পরিবর্তে শেষ বাইটটি স্ট্রিপ করে (সুতরাং সম্ভবত শেষ চরিত্রটি যদি এটি মাল্টি-বাইট হয়ে থাকে তবে দুর্নীতিগ্রস্থ হবে )।
expr
বৈকল্পিক অনুমান $t
একাধিক newline অক্ষর শেষ হয় না। যদি ফলে স্ট্রিং হচ্ছে শেষ পর্যন্ত এটি একটি নন-জিরো প্রস্থান অবস্থা ফিরে আসবে 0
(অথবা 000
বা এমনকি -0
কিছু বাস্তবায়নের সহ)। স্ট্রিংয়ে অবৈধ অক্ষর থাকলে এটি অপ্রত্যাশিত ফলাফলও দিতে পারে।
t=${t%?}
বোর্ন নয় তবে আপনি আজকাল বোর্ন শেল পেরিয়ে আসবেন না। ${t%?}
যদিও অন্য সবগুলিতে কাজ করে।
fish
কাজ চলছে। ২.৩.০ যা বিল্টিনটি চালু করেছিল string
তা প্রশ্নোত্তরের সময়ে প্রকাশিত হয়নি not আমি যে সংস্করণটি এটি পরীক্ষা করছি তাতে আপনার প্রয়োজন string replace -r '(?s).\z' '' -- $t
(এবং আমি আশা করতাম যে তারা এটি পরিবর্তন করতে চান, তাদের পিসিআরইতে যে পতাকাগুলি প্রেরণ করা হয়েছে সেগুলি পরিবর্তন করা উচিত) বা আরও সংশ্লেষিত হয়েছে। এটি নিউলাইন চরিত্রগুলির সাথেও খারাপভাবে আচরণ করে এবং আমি জানি তারাও এটি পরিবর্তন করার পরিকল্পনা করছে're
সর্বাধিক বহনযোগ্য এবং সংক্ষিপ্ততম উত্তরটি প্রায় অবশ্যই:
${t%?}
এটি বাশ, শ, ছাই, ড্যাশ, ব্যস্তবক্স / অ্যাশ, জেডএস, কেএসএ ইত্যাদিতে কাজ করে
এটি পুরানো-স্কুল শেল প্যারামিটার সম্প্রসারণ ব্যবহার করে কাজ করে। বিশেষত, গ্লোব প্যাটার্নের সাথে মেলে এমন %
পরামিতিগুলির সবচেয়ে ছোট ম্যাচিং প্রত্যয়টি মুছে ফেলার জন্য নির্দিষ্ট করে (যেমন: কোনও অক্ষর)।t
?
একটি (অনেক) আরও বিশদ বিবরণ এবং আরও পটভূমির জন্য এখানে "ক্ষুদ্রতম প্রত্যয় প্যাটার্ন সরান" দেখুন । man bash
"প্যারামিটার সম্প্রসারণ" এর অধীনে আপনার শেলের জন্য দস্তাবেজগুলি (যেমন :) দেখুন।
পার্শ্ব নোট হিসাবে, আপনি যদি পরিবর্তে প্রথম অক্ষরটি সরিয়ে ফেলতে চান তবে আপনি ব্যবহার করবেন ${t#?}
, যেহেতু #
পিছনের (প্রত্যয়) পরিবর্তে স্ট্রিংয়ের (উপসর্গ) সামনের দিক থেকে ম্যাচগুলি।
এছাড়াও লক্ষণীয় যে উভয় %
এবং #
আছে %%
এবং ##
সংস্করণ, যা সংক্ষিপ্তের পরিবর্তে প্রদত্ত প্যাটার্নটির দীর্ঘতম সংস্করণের সাথে মেলে । উভয় ${t%%?}
এবং ${t##?}
এই ক্ষেত্রে তাদের একক অপারেটর হিসাবে একই কাজ করবে, যদিও (সুতরাং অকেজো অতিরিক্ত অক্ষর যুক্ত করবেন না)। এর কারণ প্রদত্ত ?
প্যাটার্নটি কেবল একটি একটি চরিত্রের সাথে মেলে। *
কিছু অ-ওয়াইল্ডকার্ডের সাথে মিশ্রিত করুন এবং জিনিসগুলি আরও %%
এবং আরও আকর্ষণীয় হয়ে ওঠে ##
।
প্যারামিটারের বিস্তৃতি বোঝা, বা কমপক্ষে তাদের অস্তিত্ব সম্পর্কে জেনে রাখা এবং সেগুলি কীভাবে সন্ধান করা যায় তা জেনে রাখা, অনেক স্বাদের শেল স্ক্রিপ্টগুলি লেখার এবং ডিক্রিফারিংয়ের জন্য অবিশ্বাস্যভাবে কার্যকর। প্যারামিটার প্রসারণও প্রায়ই অনেক মানুষের কাছে রহস্যময় শেল জাদু মত চেহারা কারণ ... ভাল ... তারা হয় রহস্যময় শেল জাদু (যদিও চমত্কার তথ্যসমৃদ্ধ যদি আপনি "প্যারামিটার সম্প্রসারণ" জন্য সন্ধান জানি)। আপনি শেল আটকে গেলে অবশ্যই ডিভাইস বেল্টে থাকা ভাল।
আপনি head
সর্বশেষ অক্ষর ব্যতীত সমস্ত মুদ্রণ করতেও ব্যবহার করতে পারেন ।
$ s='i am a string'
$ news=$(echo -n $s | head -c -1)
$ echo $news
i am a strin
তবে দুর্ভাগ্যক্রমে কয়েকটি সংস্করণ head
নেতৃস্থানীয় -
বিকল্পটি অন্তর্ভুক্ত করে না । এটি head
ওএস এক্সের ক্ষেত্রে আসে for
খাঁটি বাশের কিছু সম্ভাব্য ব্যবহারগুলি সম্পূর্ণ করার জন্য:
#!/bin/bash
# Testing substring removal
STR="Exemple string with trailing whitespace "
echo "'$STR'"
echo "Removed trailing whitespace: '${STR:0:${#STR}-1}'"
echo "Removed trailing whitespace: '${STR/%\ /}'"
প্রথম বাক্য গঠনটি একটি স্ট্রিং থেকে একটি স্ট্রিং নেয়, বাক্য বাক্যটি
দ্বিতীয়টির জন্য চিহ্নটি লক্ষ্য করুন , যার অর্থ 'রেখার শেষ থেকে' এবং বাক্য গঠনটি হ'ল
${STRING:OFFSET:LENGTH}
%
${STRING/PATTERN/SUBSTITUTION}
এবং এখানে উল্লিখিত দুটি সংক্ষিপ্ত রূপ রয়েছে
echo "Removed trailing whitespace: '${STR::-1}'"
echo "Removed trailing whitespace: '${STR%\ }'"
এখানে আবার %
চিহ্নটি লক্ষ্য করুন, যার অর্থ 'মুছে ফেলুন (যেটি প্রতিস্থাপন করুন') সাথে সংক্ষিপ্ততম ম্যাচিং প্যাটার্ন (এখানে প্যারামিটারের শেষে থেকে ' পালানো স্থান দ্বারা উপস্থাপিত ' represented ' - এখানে নামকরণ করা হয়েছে এসটিআর